如果 rtph265pay 在 rtph265depay 之前启动,GStreamer rtph265pay/rtph265depay 不工作
GStreamer rtph265pay/rtph265depay does not work if rtph265pay started before rtph265depay
给定两个 GStreamer 管道:
发件人:
gst-launch-1.0 videotestsrc do-timestamp=true pattern=snow ! video/x-raw,width=640,height=480,framerate=30/1 ! x265enc ! h265parse ! rtph265pay ! udpsink host=127.0.0.1 port=5801
接收者
gst-launch-1.0 -v udpsrc port=5801 ! application/x-rtp,encoding-name=H265 ! rtph265depay ! decodebin ! autovideosink sync=false
如果我先启动 Receiver
,管道工作正常。如果我先启动 Sender
,接收管道实际上不会开始显示任何输出。它确实将以下内容打印到终端:
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = application/x-rtp, encoding-name=(string)H265, media=(string)video, clock-rate=(int)90000
/GstPipeline:pipeline0/GstRtpH265Depay:rtph265depay0.GstPad:sink: caps = application/x-rtp, encoding-name=(string)H265, media=(string)video, clock-rate=(int)90000
知道为什么会这样吗?我假设在流的开头发送了某种形式的“开始”数据包,接收器需要为此“唤醒”,但这纯粹是基于直觉,而不是任何文档。
我找到了解决方案,如果我阅读 rtph265pay
的文档,我就会找到它。 https://gstreamer.freedesktop.org/documentation/rtp/rtph265pay.html?gi-language=c
有一个名为config-interval
的参数,它是“发送VPS,SPS和PPS插入间隔秒”。此参数最初为 0,这意味着它可能只在流的开头发送它,而不会再次发送。将此值设置为正数使接收方能够在每次发送此数据时开始读取流。对于我的应用程序,值 1s 效果很好。
给定两个 GStreamer 管道:
发件人:
gst-launch-1.0 videotestsrc do-timestamp=true pattern=snow ! video/x-raw,width=640,height=480,framerate=30/1 ! x265enc ! h265parse ! rtph265pay ! udpsink host=127.0.0.1 port=5801
接收者
gst-launch-1.0 -v udpsrc port=5801 ! application/x-rtp,encoding-name=H265 ! rtph265depay ! decodebin ! autovideosink sync=false
如果我先启动 Receiver
,管道工作正常。如果我先启动 Sender
,接收管道实际上不会开始显示任何输出。它确实将以下内容打印到终端:
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = application/x-rtp, encoding-name=(string)H265, media=(string)video, clock-rate=(int)90000
/GstPipeline:pipeline0/GstRtpH265Depay:rtph265depay0.GstPad:sink: caps = application/x-rtp, encoding-name=(string)H265, media=(string)video, clock-rate=(int)90000
知道为什么会这样吗?我假设在流的开头发送了某种形式的“开始”数据包,接收器需要为此“唤醒”,但这纯粹是基于直觉,而不是任何文档。
我找到了解决方案,如果我阅读 rtph265pay
的文档,我就会找到它。 https://gstreamer.freedesktop.org/documentation/rtp/rtph265pay.html?gi-language=c
有一个名为config-interval
的参数,它是“发送VPS,SPS和PPS插入间隔秒”。此参数最初为 0,这意味着它可能只在流的开头发送它,而不会再次发送。将此值设置为正数使接收方能够在每次发送此数据时开始读取流。对于我的应用程序,值 1s 效果很好。