我有多个.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...
...
我在尝试:
您的建议为何会发生这种情况? 我提醒你,一切都可以达到两个pcap。无论pcaps 1与2还是5还是6还是......
UPD。尝试使用队列作为 otopolsky 描述,但仍然无法正常工作。我把队列放在tee元素之后。但同样的错误。我认为这是因为两个不同线程中的rtpjitterbuffer在同一个变量中使用(来自主线程?)
也许还有另一种方法可以让rtp TIMESTAMP的音频和视频从pcap同步?
答案 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 - 我希望答案是..如果没有那么更新问题或在评论中提问。