【发布时间】:2017-05-16 19:37:08
【问题描述】:
我正在开发一个从 RTP 流中检索音频的应用程序。我对 G.711 uLaw 和 ALaw 没有问题,但我还必须处理 G.722 协议。 到目前为止,我还没有运气解码它。我尝试使用 NAudio,它有一个编解码器,但没有运气。 NAudio 中编解码器的文档非常有限。 有谁知道一个像样的图书馆,里面有文档或示例如何做到这一点?
如果该库包含其他编解码器,那就更好了!
到目前为止我的代码片段,使用 NAudio。此代码针对每个 160 字节的数据包有效负载运行:如果有人发现错误或您有建议,请告诉我。
case RtpPacket.PayloadTypes.G722:
G722CodecState state = new G722CodecState(64000, G722Flags.None);
G722Codec codec = new G722Codec();
var length = packet.Payload.Length;
var outputBuffer = new short[length*4];
int decoded = codec.Decode(state, outputBuffer, packet.Payload, length);
【问题讨论】:
-
你能告诉我sdp sip邀请吗?否则尝试使用作为第一步wireshark>电话>VoIP呼叫来听你的来电。如果没问题,你确定你的 SIP 协议的邀请没问题,并且你正在接收正确的有效负载,你可以进入下一步:编解码器
-
我理解您的推理,但正如我所说,我有一个可以处理 G.711 的完整运行应用程序。我只需要处理一些其他的编解码器。
-
我发现了一件事,回想起来这是合乎逻辑的:我现在将这些对象用作类变量,而不是为每个数据包创建一个状态和编解码器对象,它们在 rtp 的持续时间内存在溪流。不幸的是,NAudio 缺少这方面的文档,尽管我喜欢这个库的功能。
-
所以,如果有人能指出我的方向,最好是免费的 G.723 和/或 G.729 编解码器,这将对我有很大帮助!
-
一个可以处理G711的应用程序并不意味着它也可以处理G722的payload,它真的取决于对方。作为第一步,您需要使用正确的编解码器名称发送正确的 sdp,并且对方应该处理它。例如,您需要在 SIP 的 Ok 中发送像这样的“a”属性:“a=rtpmap:9 g722/16000”,告诉对方我想使用 G722 作为编解码器。如果您收到一些 RTP 数据包,那么您应该能够在 wireshark 上收听您的数据包。如果收到 0packets 表示对方不能处理 G722 至少 16000Hz 的速率