GStreamer的。多个pcap到avi

时间:2016-09-12 20:22:41

标签: streaming gstreamer h.264 wireshark winpcap

我有多个.pcap文件01.pcap,02.pcap,... N.pcap,它们包括两个流,Audio-G.711 Video-H.264。每个pcap都有~1分钟的流媒体而且我需要制作一个.avi。 我使用mergecap.exe将pcaps连接到一个大的pcap。

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井..当我连接两个.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在同一个变量中使用(来自主线程?)

也许还有另一种方法可以让rtp TIMESTAMP的音频和视频从pcap同步?

1 个答案:

答案 0 :(得分:1)

我认为80%的问题是你在处理每个tee分支之前没有放入队列..当所有rtpjitterbuffers都在一个线程中时,它们可能会相互锁定。因此,我最好的猜测是在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 - 我希望答案是..如果没有那么更新问题或在评论中提问。