我有包含 RTP 数据的 pcap 文件,而 RTP 数据又是 G.729 编解码器的音频。有没有办法通过将其推入 FFMPEG 来解码该流?这可能意味着我必须从 PCAP 文件中提取 RTP 有效负载数据,然后以某种方式将其传递给 FFMPEG。
非常感谢任何指导方针和指示!
这个答案不需要
ffmpeg
,但我假设你并不真正关心音频是如何提取的...在wireshark wiki上查看How to Decode G729...
在 Wireshark 中,使用菜单“统计 -> RTP -> 显示所有流”。选择所需的流并按“分析”。
在下一个对话框屏幕中,按“保存有效负载...”。保存选项有
Format = .raw
和 Channel = forward
。命名文件 my_input.raw
.
.raw
解码器将
.pcm
文件转换为 Open G.729
格式。语法:va_g729_decoder.exe my_input.raw my_output.pcm
。或者对于 Linux:wine va_g729_decoder.exe my_input.raw my_output.pcm
。
.pcm
文件包含 8000 Hz 的 16 位线性 PCM 样本。请注意,每个示例均采用 Little-Endian 格式。要转换为
.au
格式,您所需要做的就是在前面添加 24 字节 au 标头,并将每个 PCM 样本转换为网络字节顺序(或 Big-Endian)。下面的 perl
脚本就可以解决这个问题。
perl pcm2au.pl [my_inputFile] [my_outputFile]
$usage = "Usage: 'perl $0 [Source PCM File] [Destination AU File]' ";
$my_inputFile = shift or die $usage;
$my_outputFile = shift or die $usage;
open(INPUTFILE, "$my_inputFile") or die "Unable to open file: $!\n";
binmode INPUTFILE;
open(OUTPUTFILE, "> $my_outputFile") or die "Unable to open file: $!\n";
binmode OUTPUTFILE;
###################################
# Write the AU header
###################################
print OUTPUTFILE ".snd";
$foo = pack("CCCC", 0,0,0,24);
print OUTPUTFILE $foo;
$foo = pack("CCCC", 0xff,0xff,0xff,0xff);
print OUTPUTFILE $foo;
$foo = pack("CCCC", 0,0,0,3);
print OUTPUTFILE $foo;
$foo = pack("CCCC", 0,0,0x1f,0x40);
print OUTPUTFILE $foo;
$foo = pack("CCCC", 0,0,0,1);
print OUTPUTFILE $foo;
#############################
# swap the PCM samples
#############################
while (read(INPUTFILE, $inWord, 2) == 2) {
@bytes = unpack('CC', $inWord);
$outWord = pack('CC', $bytes[1], $bytes[0]);
print OUTPUTFILE $outWord;
}
close(OUTPUTFILE);
close(INPUTFILE);
提取 RTP/RTCP 数据包:使用 rtpbreak 等工具: