如何在naudio中逐帧直播mp3
How to live stream mp3 frames by frames in naudio
我正在尝试在录制时以 mp3 格式直播音频,但我无法获得良好的流媒体质量。
我正在做的是从 "WI_DataAvailable" 获取 10 秒的 PCM 数据并将其转换为 MP3,然后在网络中发送帧。它在 10 秒的数据之间几乎没有静音。
我喜欢在录制时逐帧播放 mp3。有什么好的方法吗?
鉴于 LameMP3FileWriter 需要一个 Stream 来写入,我建议实现您自己的流 class 并将到达 Write
方法的所有数据简单地写入 UDP。然后你可以将它传递给 LameMP3FileWriter。
这是一个简单的流 class 应该可以帮助您入门。您需要填写方法 Write
的空白,可能还有 Flush
。我想您可以将其他所有内容保留为 NotImplemented。
public class UdpStream:Stream
{
public override int Read(byte[] buffer, int offset, int count)
{
//you'll definitely need to implement this...
//write the buffer to UDP
}
public override void Flush()
{
//you might need to implement this
}
public override bool CanRead
{
get { return false; }
}
public override bool CanSeek
{
get { return false; }
}
public override bool CanWrite
{
get { return true; }
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotImplementedException();
}
public override void SetLength(long value)
{
throw new NotImplementedException();
}
public override void Write(byte[] buffer, int offset, int count)
{
throw new NotImplementedException();
}
public override long Length
{
get { throw new NotImplementedException(); }
}
public override long Position {
get{throw new NotImplementedException();}
set{throw new NotImplementedException();}
}
}
我正在尝试在录制时以 mp3 格式直播音频,但我无法获得良好的流媒体质量。
我正在做的是从 "WI_DataAvailable" 获取 10 秒的 PCM 数据并将其转换为 MP3,然后在网络中发送帧。它在 10 秒的数据之间几乎没有静音。
我喜欢在录制时逐帧播放 mp3。有什么好的方法吗?
鉴于 LameMP3FileWriter 需要一个 Stream 来写入,我建议实现您自己的流 class 并将到达 Write
方法的所有数据简单地写入 UDP。然后你可以将它传递给 LameMP3FileWriter。
这是一个简单的流 class 应该可以帮助您入门。您需要填写方法 Write
的空白,可能还有 Flush
。我想您可以将其他所有内容保留为 NotImplemented。
public class UdpStream:Stream
{
public override int Read(byte[] buffer, int offset, int count)
{
//you'll definitely need to implement this...
//write the buffer to UDP
}
public override void Flush()
{
//you might need to implement this
}
public override bool CanRead
{
get { return false; }
}
public override bool CanSeek
{
get { return false; }
}
public override bool CanWrite
{
get { return true; }
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotImplementedException();
}
public override void SetLength(long value)
{
throw new NotImplementedException();
}
public override void Write(byte[] buffer, int offset, int count)
{
throw new NotImplementedException();
}
public override long Length
{
get { throw new NotImplementedException(); }
}
public override long Position {
get{throw new NotImplementedException();}
set{throw new NotImplementedException();}
}
}