将RTP有效负载(有效负载类型107,AMR-WB 16khz 1Channel)转换为.wav

时间:2020-05-22 18:50:40

标签: python-3.x wav scapy converters amr

我正在Linux Ubuntu下使用Python 3.6进行工作,我使用Scapy库从包含以下堆栈的bin文件中提取数据:IP / UDP / RTP。 RTP-PAYLOAD TYPE为107(动态),a = rtpmap:107 AMR-WB / 16000/1。

我以原始格式将其放入文件中,并命名为 src.aud ,但是以十六进制形式写入也不会有问题。现在我该怎么做才能将其转换为音频数据格式,例如每台计算机上的.wav或.mp3格式?

我已经为这个文件付出了努力:

https://gist.github.com/ollyja/5fe34ba997d8fa8a3f6ff4fb883feca2

但是对SILK音频解码器有依赖性。

https://github.com/gaozehua/SILKCodec

但这全都是用C编写的,我不知道如何在我的环境中使用它。是不是有一个简单的方法,或者我想念s.th。 ?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您需要使用AMR解码器(ffmpeg-libavcodec)来解码AMR有效载荷数据。

AMR解码器将为您提供PCM数据,可以将其写入到wav文件(16 KHz)中。

AMR编解码器库可与ctypes python接口一起使用-使用C库扩展Python。

答案 1 :(得分:0)

文档RFC4867(在Google上很容易找到),第4.3、4.4和5章。首先,如果RTP-PAYLOAD是带宽有效的(第4.3章)或八位字节对齐(4.4),则必须找出它。在这种情况下,它的带宽效率达到了4.3.4的要求。并且必须先按照第5、5.1和5.3章进行转换,然后再将其写入file.amr或file.awb(两者均有效)。

可以使用VLC-Media播放器和Linux Ubuntu的“视频”收听生成的文件。但也可以通过在线转换器“ convertio”将其转换为各种音频文件。

https://convertio.co/it/

在Python中执行此操作的直接方法是包装FFmpeg的Python库ffmpy。

https://ffmpy.readthedocs.io/en/latest/

在快速入门下,有一个解决问题的示例。