使用 FFMPEG 从 RTP 流 (PCAP) 解码 G.729

问题描述 投票:0回答:3

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

非常感谢任何指导方针和指示!

networking ffmpeg ip rtp pcap
3个回答
2
投票

这个答案不需要

ffmpeg
,但我假设你并不真正关心音频是如何提取的...在wireshark wiki上查看How to Decode G729...

  1. 在 Wireshark 中,使用菜单“统计 -> RTP -> 显示所有流”。选择所需的流并按“分析”。

  2. 在下一个对话框屏幕中,按“保存有效负载...”。保存选项有

    Format = .raw
    Channel = forward
    。命名文件
    my_input.raw
    .

  3. 使用
  4. .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
    
    

  5. .pcm

    文件包含 8000 Hz 的 16 位线性 PCM 样本。请注意,每个示例均采用 Little-Endian 格式。要转换为

    .au
    格式,您所需要做的就是在前面添加 24 字节 au 标头,并将每个 PCM 样本转换为网络字节顺序(或 Big-Endian)。下面的
    perl
    脚本就可以解决这个问题。
    
    

  6. 用途:
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);



1
投票

提取 RTP/RTCP 数据包:使用 rtpbreak 等工具:
    http://dallachiesa.com/code/rtpbreak/
  1. 生成(使用编辑器)要在 ffmpeg 或 mplayer 或 vlan 上传递的 sdp 文件
  2. 使用 SDP 文件启动 ffmpeg(或 mplayer 或 vlan)
  3. 使用 rtpplay 在 ffmpeg 上流式传输 RTP/RTCP 数据包:
  4. http://www.cs.columbia.edu/irt/software/rtptools/
  5. 但是,如果您的目标“仅”是 pcap 音频解码(使用 RTP G729 编解码器),那么您可以使用 videosnaf 或 xplico


1
投票

© www.soinside.com 2019 - 2024. All rights reserved.