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

发布于 2024-12-09 06:38:13 字数 158 浏览 0 评论 0原文

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

任何指导方针和指示都将受到高度赞赏!

I have pcap file that contains RTP data which in turn is audio for G.729 codec. Is there a way to decode this stream by pushing it into FFMPEG? This would probably mean I have to extract the RTP payload data from the PCAP file and then somehow pass it to FFMPEG.

Any guidelines and pointers are highly appreciated!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

痞味浪人 2024-12-16 06:38:13

这个答案不需要 ffmpeg,但我假设您并不真正关心如何提取音频......查看 如何解码 G729 在 Wireshark wiki...

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

  2. 在下一个对话框屏幕中,按“保存有效负载...”。保存选项有 Format = .rawChannel =forward。命名文件 my_input.raw

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

  4. .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);

This answer doesn't require ffmpeg, but I assume you dont really care how the audio is extracted... check out How to Decode G729 on the wireshark wiki...

  1. In Wireshark, use menu "Statistics -> RTP -> Show All Streams". Select the desired stream and press "Analyze".

  2. In the next dialog screen, press "Save Payload...". Save options are Format = .raw and Channel = forward. Name file my_input.raw.

  3. Convert the .raw file to .pcm format using the Open G.729 decoder. Syntax: va_g729_decoder.exe my_input.raw my_output.pcm. Or for Linux: wine va_g729_decoder.exe my_input.raw my_output.pcm.

  4. The .pcm file contains 16-bit linear PCM samples at 8000 Hz. Note that each sample is in Little-Endian format. To convert to .au format, all you need to do is prepend the 24-byte au header, and convert each PCM sample to network byte order (or Big-Endian). The following perl script will do the trick.

USAGE: 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);
半透明的墙 2024-12-16 06:38:13

您可以使用的步骤是:

  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/

但是,如果您的目标“仅”是 pcap 音频解码(使用 RTP G729 编解码器),那么您可以使用 videosnaf 或普利科

The steps that you can use are:

  1. extract the RTP/RTCP packets: with a tool like rtpbreak: http://dallachiesa.com/code/rtpbreak/
  2. generate (with and editor) a sdp file to be passed at ffmpeg or mplayer or vlan
  3. launch ffmpeg (or mplayer or vlan) with SDP file
  4. stream RTP/RTCP packets at ffmpeg with rtpplay: http://www.cs.columbia.edu/irt/software/rtptools/

But if your goal is "only" the pcap-audio decoding (with RTP G729 codec) then you can use videosnaf or xplico

想你只要分分秒秒 2024-12-16 06:38:13

va_g729_decoder.exe 仅适用于 win32。64 位 Windows 怎么样?

va_g729_decoder.exe only works for win32.What about 64bit windows ?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文