管道未完成从 READY 到 PAUSED 的转换

Pipeline does not complete transition from READY to PAUSED

我正在使用一个管道来播放一个文件,同时为其他目的生成一个缩放版本(因此是 appsink)。

管道如下:

gst-launch-1.0.exe filesrc location=a.mp4 ! decodebin ! tee name=fork 
   fork. ! queue ! videoconvert ! autovideosink 
   fork. ! queue ! videoconvert ! videoscale ! video/x-raw,format=I420,width=320,height=180 ! x264enc ! appsink

并且没有完成从 READY 到 PAUSED 的转换。如果我执行以下操作之一,它将完成转换(然后通过移动到 PLAYING 正确播放):

  1. 删除从 tee 退出的两个分支之一(因此 x264enc 单独工作)
  2. 从指向 appsink 的分支标题中删除 x264enc 元素。

这里有一张图,其中的管道与上面的管道非常接近,显示了同样的问题。 'guilty' 元素是仍在 READY->PAUSED 转换中的 appsink,但我看不出有任何原因。顺便说一下,如果我从 appsink 分支中删除 x264enc,它就可以工作了!

为什么?

x264enc 元素尝试选项 tune=zerolatency。或者在 tee 之后增加 queue 大小。这样做的原因是 x264enc 在其默认配置中的延迟比默认 queue 大小要长。例如。在它产生任何数据之前,它消耗的比其他 queue 路径可以容纳的更多。所以这两个分支相互死锁,无法预滚动。