如何将字节数组转换为音频文件?
How to convert byte array to audio file?
我编写了一个从网络实时获取SIP数据包的程序,我想使用数据包中嵌入的SDP信息来捕获两个VOIP软电话的音频对话。
一旦我从 RTP 协议中检索到二进制数据,我应该如何将其转换为声音文件?
首选c++。
嗨,阿德里安,欢迎,
你说得对,我们不能直接把RTP payload放在一个接一个的文件中,然后把这个文件当成音频文件来读,比方说一个".wav"
.
您正在寻找的缺失部分是一段代码,该代码重新assemble,将数据包的 rtp 流解码并播放为语音样本;为了简单起见,考虑众所周知的 G.711
或 PCM
编解码器,因为所有 SIP phone 都支持此编解码器。
您需要实现一个 Playout buffer
(逻辑上是一个无限缓冲区,但可以环绕的环形缓冲区)。
数据包本身包含持续时间为 20 毫秒的小负载的音频数据。每块音频数据前面都有一个RTP头,表示编码的类型(这与SDP信息有关,你对那部分有很好的理解)。
对于每个数据包:
以正确的速率将 8 位值解码为 16 位样本,通常每秒 8,000 次 G.711
;
从RTP头计算出播放点,它是播放缓冲区数组中的索引。
根据 RTP 时间戳考虑抖动和重新排序
将示例写入 .wav
或在音频设备上播放。
从实用的角度来看,您可以通过以下几种方式做到这一点:
- 您将所有 UDP/RTP 数据包收集到一个捕获文件中,并使用
wireshark
完成艰苦的工作;
- 使用现有工具,例如 playSIP A command-line SIP session recorder;
- 为此目的获取库或编写现有代码,但这不是一件容易的事。例如,您可以考虑处理数据包丢失。
如果您的需求只是从录音的角度来看
( .wav 文件 - 通话中使用的音频编解码器是 a-law /u-law)
无需编码即可采用这种方法。
使用Wireshark抓包(在pcap文件中)
Wireshark-> 电话 -> 流分析
在流分析中 windows -> 保存(下拉菜单 - select Forward/reverse 流音频)
以 .raw 文件格式保存。
在 Audacity 中打开 .raw 文件格式并将其转换为 .wav 文件。
希望对你有所帮助。
我编写了一个从网络实时获取SIP数据包的程序,我想使用数据包中嵌入的SDP信息来捕获两个VOIP软电话的音频对话。
一旦我从 RTP 协议中检索到二进制数据,我应该如何将其转换为声音文件?
首选c++。
嗨,阿德里安,欢迎,
你说得对,我们不能直接把RTP payload放在一个接一个的文件中,然后把这个文件当成音频文件来读,比方说一个".wav"
.
您正在寻找的缺失部分是一段代码,该代码重新assemble,将数据包的 rtp 流解码并播放为语音样本;为了简单起见,考虑众所周知的 G.711
或 PCM
编解码器,因为所有 SIP phone 都支持此编解码器。
您需要实现一个 Playout buffer
(逻辑上是一个无限缓冲区,但可以环绕的环形缓冲区)。
数据包本身包含持续时间为 20 毫秒的小负载的音频数据。每块音频数据前面都有一个RTP头,表示编码的类型(这与SDP信息有关,你对那部分有很好的理解)。
对于每个数据包:
以正确的速率将 8 位值解码为 16 位样本,通常每秒 8,000 次
G.711
;从RTP头计算出播放点,它是播放缓冲区数组中的索引。 根据 RTP 时间戳考虑抖动和重新排序
将示例写入
.wav
或在音频设备上播放。
从实用的角度来看,您可以通过以下几种方式做到这一点:
- 您将所有 UDP/RTP 数据包收集到一个捕获文件中,并使用
wireshark
完成艰苦的工作; - 使用现有工具,例如 playSIP A command-line SIP session recorder;
- 为此目的获取库或编写现有代码,但这不是一件容易的事。例如,您可以考虑处理数据包丢失。
如果您的需求只是从录音的角度来看
( .wav 文件 - 通话中使用的音频编解码器是 a-law /u-law)
无需编码即可采用这种方法。
使用Wireshark抓包(在pcap文件中)
Wireshark-> 电话 -> 流分析
在流分析中 windows -> 保存(下拉菜单 - select Forward/reverse 流音频)
以 .raw 文件格式保存。
在 Audacity 中打开 .raw 文件格式并将其转换为 .wav 文件。
希望对你有所帮助。