我有多个.pcap文件01,pcap.02,...N.pcap,它们包括两个流,Audio-G.711视频-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这条管道适用于一口井。当我解析两个.pcaps时,它也是工作的。但是,如果超过2个数据包-> 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.....。
我试着:
你的建议为什么会这样?我提醒你,每样东西都可以达到两便士。不管pcaps 1有2还是5有6,或者.
UPD。就像otopolsky描述的那样,试图使用队列,但仍然没有发挥作用。我在T元素后面排了队。但同样的错误。我认为这是因为两个不同线程中的rtpjitterbuffer在同一个变量中使用(来自主线程?)
也许还有另一种方法使音频和视频通过rtp时间戳与pcap同步?
发布于 2016-09-20 07:08:43
我认为80%的问题是,在处理每个tee分支之前,不要在队列中放置队列。当所有rtpjitterbuffers都在一个线程中时,它们可以彼此锁定。因此,我最好的猜测是,将队列放在pcap解译之后,或者可能放在它之前,以便完全确定:
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.您可以使用队列的位置或放置更多的队列。请记住,队列不仅用于缓冲目的,而且主要用于将处理分离到不同的线程--它编写得很好的这里 --在开始时检查显示线程的好图片。
我希望这是答案。如果没有,那么更新问题或在评论中提问。
https://stackoverflow.com/questions/39458232
复制相似问题