我写了一个定制的QtGStreamer appsink,工作正常。 由于管道开始预卷,但从未进入播放状态,因此我试图用管道分开管道来处理流的记录时遇到了麻烦。
我的管道:
souphttpsrc location="%1" ! queue ! tee name=tp tp.! queue ! tsdemux ! h264parse ! splitmuxsink muxer=mpegtsmux location=/tmp/rec/video%02d.mov max-size-time=60000000000 max-size-bytes=100000000 tp.! queue ! appsink name="mysink"
如果我对两个发球区中的任何一个发表评论,那么任何事情都会按预期进行。
这也有效:
souphttpsrc location="%1" ! queue ! tee name=tp tp.! queue ! tsdemux ! h264parse ! splitmuxsink muxer=mpegtsmux location=/tmp/rec/video%02d.mov max-size-time=60000000000 max-size-bytes=100000000 tp.! queue ! decodebin ! autovideosink
为什么我的AppSink独自工作?
答案 0 :(得分:0)
评论太大了..
如何处理appsink缓冲区?它在主线程中你通过阻塞调用来获取缓冲区,或者你在等待new-sample / new-preroll信号(这是非阻塞 - 推送风格)?
检查这个我的意思(appsink章节):
https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-data-spoof.html
您的申请被阻止了吗?
我怀疑(我可能错了)应用程序被阻止,因为它被许多缓冲区淹没..发球台是非常棘手的元素..如果一个分支在发球台之后想要预先滚动例如100个缓冲区那么它会导致100缓冲区也会转到另一个分支,这可能会阻止例如在等待播放状态时阻塞整个管道的appsink(或者我不知道你在app逻辑中做了什么)..
您可以尝试一些方法来解决这个问题:
drop=true
添加到appsink leaky=2
以测试它是否有帮助(非常类似于1,只是不同的技术)GST_DEBUG=3,queue_dataflow:5
时使用这个env变量(我认为它是5,我希望我能正确记住调试类别)