2016-09-12 3 views
1

У меня есть несколько файлов .pcap 01.pcap, 02.pcap, ... N.pcap, они включают в себя два потока, Audio-G.711 Video-H.264. Каждый pcap имеет ~ 1 минуту потоковой передачи. И мне нужно сделать один .avi. Я использую файл mergecap.exe для объединения pcaps в один большой pcap.Gstreamer. Несколько pcap для avi

mergecap.exe -F pcap 01.pcap 02.pcap ....N.pcap -w out.pcap 

После этого я использую GStreamer, чтобы сделать .avi файл

gst-launch-1.0 filesrc location=out.pcap ! tee name=t ! pcapparse dst-ip=192.168.2.55 dst-port=5010^
     ! application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96^
     ! rtpjitterbuffer^
     ! rtph264depay^
     ! h264parse^
     ! queue^ 
     ! mux. t. ! pcapparse dst-ip=192.168.2.55 dst-port=4010^
     ! application/x-rtp, media=(string)audio, clock-rate=(int)8000, encoding-name=(string)PCMA, channels=(int)1, payload=(int)8^
     ! rtpjitterbuffer^
     ! rtppcmadepay^
     ! queue^
     ! mux. avimux name=mux ! filesink location=test.avi 

Этот трубопровод работает в течение одного PCAP хорошо .. Когда я conatenate два .pcaps, это тоже работает. Но если это больше, чем 2 pacaps-> rtpjitterbuffer падает почти каждый видео пакет

...

0:00:03.856698538 12812 08E3FD28 WARN   rtpjitterbuffer gstrtpjitterbuffer.c:2163:gst_rtp_jitter_buffer_chain:<rtpjitterbuffer0> Packet #41238 too late as #57525 was already popped, dropping 
    0:00:03.861442222 12812 08E3FD28 WARN   rtpjitterbuffer gstrtpjitterbuffer.c:2163:gst_rtp_jitter_buffer_chain:<rtpjitterbuffer0> Packet #41239 too late as #57525 was already popped, dropping 
    0:00:03.870865810 12812 08E3FD28 WARN   rtpjitterbuffer gstrtpjitterbuffer.c:2163:gst_rtp_jitter_buffer_chain:<rtpjitterbuffer0> Packet #41240 too late as #57525 was already popped, dropping 
    0:00:03.876392403 12812 08E3FD28 WARN   rtpjitterbuffer gstrtpjitterbuffer.c:2163:gst_rtp_jitter_buffer_chain:<rtpjitterbuffer0> Packet #41241 too late as #57525 was already popped, dropping 

and continues... 
and continues... 
and continues... 

...

Я пытался:

  • Изменение задержки в rtpjitterbuffer
  • Удалить rtpjitterbuffer
  • Не использовать tee

Ваши предложения, почему это происходит? Напоминаю, что все работает до двух pcap. Независимо от того, какие pcaps 1 с 2 или 5 с 6 или ...

UPD. Пытался играть с очередями, так как otopolsky описал, но все еще не работал. Я помещаю очередь после элемента tee. Но та же ошибка. Я думаю, это связано с тем, что rtpjitterbuffer в двух разных потоках использует одну и ту же переменную (из основного потока?)

Возможно, есть другой способ сделать синхронизацию аудио и видео с pcap на rtp TIMESTAMP?

ответ

1

Я думаю, что на 80% проблема в том, что вы не ставите очередь перед обработкой каждой ветки tee. Когда все rtpjitterбуферы находятся в одном потоке, они могут блокировать друг друга. Так что моя догадка ставится очередь сразу после pcapparse или, может быть, перед ним, чтобы быть укомплектовать уверены:

gst-launch-1.0 filesrc ! tee name=t 
    avimux name=mux ! filesink location=test.avi 
    t. ! pcapparse ! x-rtp caps ! queue ! rtpjitterbuffer ! rtph264depay ! h264parse ! mux. 
    t. ! pcapparse ! x-rtp caps ! queue ! rtpjitterbuffer ! rtppcmadepay ! mux. 
    t. ! pcapparse ! x-rtp caps ! queue ! rtpjitterbuffer ! rtpwhateverelse .. ! mux. 

Вы можете играть с позиции очереди или положить больше очереди. Просто помните, что очередь используется не только для целей буферизации, но главным образом для разделения обработки на разные потоки - ее красиво написано here - проверьте изображение в начале, изображающее потоки.

HTH - Я надеюсь, что это ответ. Если нет, то обновите вопрос или спросите в комментарии.

Смежные вопросы