QtGstreamer:AppSink&开球

时间:2016-07-14 16:41:31

标签: gstreamer qtgstreamer

我写了一个定制的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独自工作?

1 个答案:

答案 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逻辑中做了什么)..

您可以尝试一些方法来解决这个问题:

  1. drop=true添加到a​​ppsink
  2. 尝试添加队列参数leaky=2以测试它是否有帮助(非常类似于1,只是不同的技术)
  3. 分析首先阻止哪个队列的调试日志。在运行你的东西GST_DEBUG=3,queue_dataflow:5时使用这个env变量(我认为它是5,我希望我能正确记住调试类别)
  4. 尝试更改fmink的splitmuxsink,它永远不会阻止 - 只是为了测试谁是罪魁祸首..如果它有帮助它也意味着splitmuxsink是请求这么多缓冲区的那个。
  5. 在任何情况下如果我都错了,你可以使用GST_DEBUG进行调试并设置3,4,5级,直到你找到一些有趣的东西..