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

Convert RTP Payload (payload type 107, AMR-WB 16khz 1Channel) to .wav

我在 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。 ?

感谢您的帮助

文档 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 中的 'Videos' 来收听生成的文件。但它也可以通过在线转换器转换成各种音频文件'convertio'。

https://convertio.co/it/

在 Python 中实现此目的的直接方法是 Python 包含 FFmpeg 包装的库 ffmpy。

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

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

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

AMR解码器会给你PCM数据,可以写入wav文件(16KHz)。

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