【发布时间】:2015-09-12 08:37:04
【问题描述】:
我使用NAudio 来满足我的音频需求,但我遇到了一个棘手的问题。我有一个可以接收 RTP 音频的远程设备。我想将音频文件流式传输到该设备(在 u-law 或类似编码 + RTP 包装之后)。但是,似乎没有一种机制来维护 RTP 数据包的传出时间。
例如,WaveOut 播放器通过简单地响应来自底层声音/directx 层的请求来“管理”时间。以这种方式,声音驱动程序实际上使用“拉”方法来维持时间。
我正在寻找的是一个组件,它可以在(例如)IWaveProvider(或类似的)上提供正确的“拉”时间,以便我可以接收每个数据包,RTP 化它,然后发送它电线。
所以,这里是核心代码:
IPEndPoint target = new IPEndPoint(addr, port);
Socket sender = new Socket( AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp );
IWaveProvider provider = new AudioFileReader(filename);
MuLawChatCodec codec = new MuLawChatCodec(); // <-- from chat example
int alignment = provider.BlockAlign * 32; // <-- arbitrary
byte [] buffer = new byte [alignment];
try
{
int numbytes;
while( (numbytes = provider.Read(buffer, 0, alignment)) != 0 )
{
byte [] encoded = m_Codec.Encode(buffer, 0, numbytes);
m_Sender.SendTo(buffer, numbytes, SocketFlags.None, target);
}
}
catch( Exception )
{
// We just assume that any exception is an exit signal.
}
发生的情况是while 循环尽可能快地抓取“音频”并将其从 UDP 端口中吹出。这不适用于 RTP,因为我们需要保持正确的输出时序。
作为测试,我尝试了带有 NotifyingSampleProvider 的 WaveOut,将每个 L/R 对馈送到编码器/RTP-ifier/sender,它似乎工作正常。但是,我正在处理的应用程序不能接受从本地扬声器(通过 WaveOut)播放音频的副作用(例如,我们可能希望同时将多个不同的文件流式传输到不同的设备)。我们也可能将音频硬件用于(例如)同时进行的软电话通话。基本上,我们不想在这个实现中实际使用本地音频硬件。
那么,有没有人知道(或编写)一个可以为发送方提供适当时间的组件?可以以适当的速率抓取音频以便我可以输入编码器/发送器链的东西?
【问题讨论】:
标签: c# streaming audio-streaming naudio