使用来自RTP流(PCAP)的FFMPEG解码G.729

时间:2011-10-12 07:50:27

标签: networking ffmpeg ip rtp pcap

我有包含RTP数据的pcap文件,而RTP数据又是G.729编解码器的音频。有没有办法通过将其推入FFMPEG来解码此流?这可能意味着我必须从PCAP文件中提取RTP有效载荷数据,然后以某种方式将其传递给FFMPEG。

非常感谢任何指南和指示!

3 个答案:

答案 0 :(得分:2)

这不需要ffmpeg,但我认为你并不真正关心如何提取音频......在wireshark维基上查看How to Decode G729 ...

  1. 在Wireshark中,使用菜单“Statistics - > RTP - > Show All Streams”。选择所需的流,然后按“分析”。

  2. 在下一个对话框屏幕中,按“Save Payload ...”。保存选项是Format = .raw和Channel = forward。名称文件sample.raw。

  3. 使用Open G.729解码器将.raw文件转换为.pcm格式。语法:va_g729_decoder.exe sample.raw sample.pcm。或者对于Linux:wine va_g729_decoder.exe sample.raw sample.pcm。

  4. .pcm文件包含8000 Hz的16位线性PCM样本。请注意,每个样本都采用Little-Endian格式。要转换为.au格式,您需要做的就是在24字节的au头之前添加,并将每个PCM样本转换为网络字节顺序(或Big-Endian)。以下Perl脚本可以解决这个问题。

  5. 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)

您可以使用的步骤是:

  1. 提取RTP / RTCP数据包:使用类似rtpbreak的工具:http://dallachiesa.com/code/rtpbreak/
  2. 生成(使用和编辑)要在ffmpeg或mplayer或vlan传递的sdp文件
  3. 使用SDP文件启动ffmpeg(或mplayer或vlan)
  4. 使用rtpplay在ffmpeg中传输RTP / RTCP数据包:http://www.cs.columbia.edu/irt/software/rtptools/
  5. 但如果你的目标只是&#34;只有&#34; pcap-audio解码(使用RTP G729编解码器)然后你可以使用videosnaf或xplico

答案 2 :(得分:1)

va_g729_decoder.exe仅适用于win32。有关64位窗口的内容吗?