【问题标题】:Decode RTP G.722 payload解码 RTP G.722 有效载荷
【发布时间】: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 的速率

标签: c# rtp codec


【解决方案1】:

我现在使用的设置如下:

类变量:

    private readonly G722CodecState _g722CodecState = new G722CodecState(64000, G722Flags.SampleRate8000);
    private readonly G722Codec _g722Codec = new G722Codec();

在我的 rtp 检索功能中:

case RtpPacket.PayloadTypes.G722:
    var length = packet.Payload.Length;
    var outputBuffer = new short[length];
    int decoded = _g722Codec.Decode(_g722CodecState, outputBuffer, packet.Payload, length);

它就像一个魅力!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2020-04-26
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多