我有包含RTP数据的pcap文件,而RTP数据又是G.729编解码器的音频。有没有办法通过将其推入FFMPEG来解码此流?这可能意味着我必须从PCAP文件中提取RTP有效载荷数据,然后以某种方式将其传递给FFMPEG。
非常感谢任何指南和指示!
答案 0 :(得分:2)
这不需要ffmpeg,但我认为你并不真正关心如何提取音频......在wireshark维基上查看How to Decode G729 ...
在Wireshark中,使用菜单“Statistics - > RTP - > Show All Streams”。选择所需的流,然后按“分析”。
在下一个对话框屏幕中,按“Save Payload ...”。保存选项是Format = .raw和Channel = forward。名称文件sample.raw。
使用Open G.729解码器将.raw文件转换为.pcm格式。语法:va_g729_decoder.exe sample.raw sample.pcm。或者对于Linux:wine va_g729_decoder.exe sample.raw sample.pcm。
.pcm文件包含8000 Hz的16位线性PCM样本。请注意,每个样本都采用Little-Endian格式。要转换为.au格式,您需要做的就是在24字节的au头之前添加,并将每个PCM样本转换为网络字节顺序(或Big-Endian)。以下Perl脚本可以解决这个问题。
USAGE:perl pcm2au.pl inputFile outputFile
$usage = "Usage: 'perl $0 <Source PCM File> <Destination AU File>' ";
$srcFile = shift or die $usage;
$dstFile = shift or die $usage;
open(SRCFILE, "$srcFile") or die "Unable to open file: $!\n";
binmode SRCFILE;
open(DSTFILE, "> $dstFile") or die "Unable to open file: $!\n";
binmode DSTFILE;
###################################
# Write the AU header
###################################
print DSTFILE ".snd";
$foo = pack("CCCC", 0,0,0,24);
print DSTFILE $foo;
$foo = pack("CCCC", 0xff,0xff,0xff,0xff);
print DSTFILE $foo;
$foo = pack("CCCC", 0,0,0,3);
print DSTFILE $foo;
$foo = pack("CCCC", 0,0,0x1f,0x40);
print DSTFILE $foo;
$foo = pack("CCCC", 0,0,0,1);
print DSTFILE $foo;
#############################
# swap the PCM samples
#############################
while (read(SRCFILE, $inWord, 2) == 2) {
@bytes = unpack('CC', $inWord);
$outWord = pack('CC', $bytes[1], $bytes[0]);
print DSTFILE $outWord;
}
close(DSTFILE);
close(SRCFILE);
答案 1 :(得分:1)
您可以使用的步骤是:
但如果你的目标只是&#34;只有&#34; pcap-audio解码(使用RTP G729编解码器)然后你可以使用videosnaf或xplico
答案 2 :(得分:1)
va_g729_decoder.exe仅适用于win32。有关64位窗口的内容吗?