Gstreamer:RTP 抖动缓冲区在丢包的情况下无法正常工作?

pap*_*ika 5 audio rtp pcap gstreamer

对于 VoIP 语音质量监控应用程序,我需要将传入的 RTP 音频流与参考信号进行比较。对于信号比较本身,我使用预先存在的专用工具。对于其他部分(除了数据包捕获),Gstreamer 库似乎是一个不错的选择。我使用以下管道来模拟简单的 VoIP 客户端:

filesrc location=foobar.pcap ! pcapparse ! "application/x-rtp, payload=0, clock-rate=8000"
  ! gstrtpjitterbuffer ! rtppcmudepay ! mulawdec ! audioconvert
  ! audioresample ! wavenc ! filesink location=foobar.wav
Run Code Online (Sandbox Code Playgroud)

pcap 文件包含单个 RTP 媒体流。我制作了一个捕获文件,该文件丢失了原始 400 个 UDP 数据报中的 50 个。对于给定的音频样本(我的示例为 8 秒长):

[XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
Run Code Online (Sandbox Code Playgroud)

如果出现一定量的连续丢包,我希望输出这样的音频信号(“ -”表示静音):

[XXXXXXXXXXXXXXXXXXXXXXXX-----XXXXXXXXXXX]
Run Code Online (Sandbox Code Playgroud)

然而,音频文件中实际保存的内容是这样的(在我的示例中短了 1 秒):

[XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]
Run Code Online (Sandbox Code Playgroud)

抖动缓冲器(该应用程序的关键部分)似乎无法正常工作。这可能是该元素的不兼容/缺陷吗pcapparse?我是否缺少管道中确保时间同步的关键部分?还有什么可能导致这种情况?

pap*_*ika 3

这个问题可以通过稍微改变管道来解决:在“通过根据需要插入或删除样本来生成完美的流audiorate”之前需要添加一个元素。然而,这仅在接收到丢包事件时才有效。为此,需要将的属性设置为 true。wavencaudioratedo-lostgstjitterbuffer

这是更正后的管道:

filesrc location=foobar.pcap ! pcapparse
  ! "application/x-rtp, payload=0, clock-rate=8000"
  ! gstrtpjitterbuffer do-lost=true ! rtppcmudepay ! mulawdec
  ! audioconvert ! audioresample ! audiorate ! wavenc
  ! filesink location=foobar.wav
Run Code Online (Sandbox Code Playgroud)