动态添加编码器时,Gstreamer 元素会阻塞很长时间

Gstreamer elements block for a long time when adding encoder dynamically

我正在创建一个应用程序,通过为请求的分辨率动态创建 ABR 阶梯来查看摄像头源。 以下是我的管道,它是静态的

gst-launch-1.0 hlssink2 name=ingest1 playlist-location=live/stream.m3u8 location=live/segment%d.ts max-files=10 target-duration=2 \
 rtspsrc location="rtsp://myrtspcamurl:554/" name=rtspsrc0" \
 rtspsrc0. ! rtph264depay ! tee name=t \
 t. ! queue ! ingest1.video \
 t. ! queue ! decodebin ! tee name=decode_t \
   decode_t. ! queue ! videorate ! videoscale ! video/x-raw,framerate=2/1,width=240,height=240 ! videoconvert ! jpegenc ! multifilesink location=stills/stills%d.jpg \
   decode_t. ! queue ! videoscale ! video/x-raw,width=640,height=360 ! openh264enc ! hlssink2 location=360/segment%d.ts playlist-location=360/stream.m3u8

我正在尝试以编程方式添加以下动态编码器管道,如下所示

 decode_t. ! queue ! videoscale ! video/x-raw,width=854,height=480 ! openh264enc ! hlssink2 location=480/segment%d.ts playlist-location=480/stream.m3u8

为了添加此管道,我从 decode_t 发球台获取了一个新的 src pad 并设置了 BLOCK_DOWNSTREAM。 一切正常。

我遇到的问题是:

当管道 运行ing 数小时摄取视频时,当我启动一个新的编码器管道时,它会阻塞另一个 360p 阶梯,直到这个新的 hlsink2(480p) 的段数达到相同的数字作为 360p.

因此,两个流的 stream.m3u8 在此之前都无法使用。它几乎看起来像是在尝试同步管道 运行 时间。

有解决办法吗? 我在 github -> https://github.com/ggovindan/abr_ladder

中也有此的工作版本

非常感谢任何帮助!!

每个 HLS 输出箱中的 videorate 默认情况下总是从 运行 时间 0 开始输出。如果你这样做

videorate.set_property("skip-to-first", true);

create_encoder_bin() 那么这应该按预期运行。