Декодирование G.729 с использованием FFMPEG из потока RTP (PCAP)

У меня есть файл pcap, содержащий данные RTP, которые, в свою очередь, являются звуком для кодека G.729. Есть ли способ декодировать этот поток, вставив его в FFMPEG? Вероятно, это означало бы, что мне нужно извлечь данные полезной нагрузки RTP из файла PCAP, а затем каким-то образом передать их в FFMPEG.

Любые рекомендации и указатели приветствуются!


person Community    schedule 12.10.2011    source источник


Ответы (3)


для этого не требуется ffmpeg, но я предполагаю, что вам все равно, как извлекается звук... посмотрите Как декодировать G729 на вики wireshark...

  1. В Wireshark используйте меню «Статистика -> RTP -> Показать все потоки». Выберите нужный поток и нажмите «Анализ».

  2. В следующем диалоговом окне нажмите «Сохранить полезную нагрузку...». Варианты сохранения: Format = .raw и Channel = forward. Назовите файл sample.raw.

  3. Преобразуйте файл .raw в формат .pcm с помощью декодера Open G.729. Синтаксис: va_g729_decoder.exe sample.raw sample.pcm. Или для Linux: wine va_g729_decoder.exe sample.raw sample.pcm.

  4. Файл .pcm содержит 16-битные выборки линейной ИКМ с частотой 8000 Гц. Обратите внимание, что каждый образец находится в формате с прямым порядком байтов. Чтобы преобразовать в формат .au, все, что вам нужно сделать, это добавить 24-байтовый заголовок au и преобразовать каждый образец PCM в сетевой порядок байтов (или Big-Endian). Следующий Perl-скрипт сделает свое дело.

ИСПОЛЬЗОВАНИЕ: perl pcm2au.pl входной файл выходной файл

$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);
person This    schedule 12.10.2011
comment
Проверяю это, пока печатаю :) - person ; 12.10.2011
comment
Что ж, это дает мне представление о том, как двигаться дальше. Вероятно, мне нужно сделать дополнительный код, чтобы превратить его в программу. Спасибо большое. - person ; 12.10.2011

Шаги, которые вы можете использовать:

  1. извлеките пакеты RTP/RTCP: с помощью такого инструмента, как rtpbreak: http://dallachiesa.com/code/rtpbreak/< /а>
  2. сгенерировать (с помощью редактора) файл sdp для передачи в ffmpeg, mplayer или vlan
  3. запустить ffmpeg (или mplayer или vlan) с файлом SDP
  4. передавать пакеты RTP/RTCP в ffmpeg с помощью rtpplay: http://www.cs.columbia.edu/irt/software/rtptools/

Но если вашей целью является «только» декодирование pcap-аудио (с кодеком RTP G729), вы можете использовать videonaf или xplico.

person Gianluca Costa    schedule 18.01.2012

va_g729_decoder.exe работает только для win32. А как насчет 64-битных окон?

person jazz    schedule 21.02.2013