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?我是否缺少管道中确保时间同步的关键部分?还有什么可能导致这种情况?
这个问题可以通过稍微改变管道来解决:在“通过根据需要插入或删除样本来生成完美的流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)
| 归档时间: |
|
| 查看次数: |
7337 次 |
| 最近记录: |