#networking #ffmpeg #ip #rtp #pcap
#сеть #ffmpeg #ip #rtp #pcap
Вопрос:
У меня есть файл pcap, содержащий данные RTP, которые, в свою очередь, являются аудио для кодека G.729. Есть ли способ декодировать этот поток, поместив его в FFMPEG? Вероятно, это означало бы, что я должен извлечь данные полезной нагрузки RTP из файла PCAP, а затем каким-то образом передать их в FFMPEG.
Любые рекомендации и указатели высоко ценятся!
Ответ №1:
для этого не требуется ffmpeg, но я предполагаю, что вам все равно, как извлекается звук … посмотрите, как декодировать G729 на wireshark wiki…
-
В Wireshark используйте меню «Статистика -> RTP -> Показать все потоки». Выберите нужный поток и нажмите «Анализировать».
-
На следующем диалоговом окне нажмите «Сохранить полезную нагрузку …». Параметры сохранения: Формат = .raw и канал = переадресация. Назовите файл sample.raw.
-
Преобразуйте файл .raw в формат .pcm с помощью открытого декодера G.729. Синтаксис: va_g729_decoder.exe образец.необработанный образец.pcm. Или для Linux: wine va_g729_decoder.exe образец.необработанный образец.pcm.
-
Файл .pcm содержит 16-разрядные линейные выборки PCM с частотой 8000 Гц. Обратите внимание, что каждая выборка представлена в формате с малым порядковым номером. Чтобы преобразовать в формат .au, все, что вам нужно сделать, это добавить 24-байтовый заголовок au и преобразовать каждый образец PCM в сетевой порядок байтов (или порядковый номер). Следующий 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);
Комментарии:
1. Проверяю это при вводе 🙂
2. Что ж, это дает мне представление о том, как двигаться дальше. Вероятно, мне потребуется выполнить дополнительное кодирование, чтобы превратить его в программу. Действительно, спасибо.
Ответ №2:
Шаги, которые вы можете использовать, следующие:
- извлеките пакеты RTP / RTCP: с помощью такого инструмента, как rtpbreak: http://dallachiesa.com/code/rtpbreak /
- создайте (с помощью и редактора) sdp-файл для передачи в ffmpeg или mplayer или vlan
- запустите ffmpeg (или mplayer, или vlan) с SDP-файлом
- поток пакетов RTP / RTCP в ffmpeg с помощью rtpplay: http://www.cs.columbia.edu/irt/software/rtptools /
Но если ваша цель — «только» декодирование pcap-аудио (с кодеком RTP G729), тогда вы можете использовать videosnaf или xplico
Ответ №3:
va_g729_decoder.exe работает только для win32.Как насчет 64-битной Windows?