首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过RTP流发送G722编码的音频?

如何通过RTP流发送G722编码的音频?
EN

Stack Overflow用户
提问于 2019-11-20 10:21:00
回答 1查看 1.4K关注 0票数 0

我有一个小型的SIP应用程序,基本上就是来自UserAgentServer的SipSorcery示例。我可以用ulaw编码的音频建立一个RTP流,然后由我的软电话接收,没有问题。

现在,我已经使用ffmepg创建了一个使用g722编码的音频文件,使用:ffmpeg -i sample.wav -ar 16000 -acodec g722 sample.g722。我可以通过ffplay sample.g722很好地播放这个音频,文件大小大约是每秒8000字节。

我对邀请请求的答复如下:

代码语言:javascript
运行
复制
v=0
o=- 55811 0 IN IP4 192.168.1.36
s=sipsorcery
c=IN IP4 192.168.1.36
t=0 0
m=audio 49000 RTP/AVP 9
a=rtpmap:9 G722/8000
a=sendrecv

但后来出了点问题。因为在wireshark中,我看到我的RTP流的有效负载是'RTPType-96‘,而软电话的RTP流显示为g722。因此,似乎编解码器类型是正确协商的,但不知怎的,我的实际RTP流仍然缺少一些信息。

我从g722编码的文件中通过RPT流发送字节,如下所示:

代码语言:javascript
运行
复制
private async Task SendG722()
{
    uint timestamp = 0;
    using (StreamReader sr = new StreamReader(this.AudioFileName))
    {
        var interval = 20;
        var bytesPerSecond = 8000;
        var packetsPerSecond = 1000 / interval;
        var bufferSize = bytesPerSecond / packetsPerSecond;

        byte[] buffer = new byte[bufferSize];
        int bytesRead = sr.BaseStream.Read(buffer, 0, buffer.Length);

        while (bytesRead > 0 && !this.CancellationTokenSource.IsCancellationRequested)
        {                
            this.Session.SendAudioFrame(this.RtpSocket, this.DestinationRtpEndPoint, timestamp, buffer);
            timestamp += (uint)buffer.Length;                    

            await Task.Delay(interval, this.CancellationTokenSource.Token);
            bytesRead = sr.BaseStream.Read(buffer, 0, buffer.Length);
        }
    }
}

但是,当字节被发送到某个地方时,RTP流和数据包出现在wireshark中。我听不到我的软电话的任何声音。而wireshark甚至找不出关于这条小溪的任何东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-20 20:24:35

我怀疑您所需要做的就是设置RTP数据包有效负载类型,以匹配您的SDP提供。

下面的行将RTP数据包报头中的有效负载类型设置为0。

代码语言:javascript
运行
复制
var rtpSession = new RTPSession(RTPPayloadTypesEnum.PCMU, null, null);

您的问题是您的SDP提供告诉接收方在RTP包报头中期望一个有效负载类型的9

修复应该简单到将ENUM更改为:

代码语言:javascript
运行
复制
public enum RTPPayloadTypesEnum
{
    PCMU = 0,
    PCMA = 1,
    G722 = 9,
    Dynamic = 96,
}

然后

代码语言:javascript
运行
复制
var rtpSession = new RTPSession(RTPPayloadTypesEnum.G722, null, null);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58951960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档