我正在使用一个管道,该管道应该播放文件,同时生成用于其他目的的缩放版本(因此是 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 的转换。如果我执行以下操作之一,它会完成转换(然后通过移动到“播放”来正确播放):
- 删除从 tee 退出的两个分支之一(这样 x264enc 就可以单独工作)
- 从分支标题中删除 x264enc 元素到 appsink。
这里有一张图表,其管道与上面的管道非常接近,显示了相同的问题。 “有罪”元素是仍处于 READY->PAUSED 转换的 appsink,但我看不出任何原因。顺便说一句,如果我从 appsink 分支中删除 x264enc,它就可以工作了!
为什么?最佳答案
尝试使用 x264enc
元素的 tune=zerolatency
选项。或者增加 tee
之后的queue
大小。其原因是默认配置下的 x264enc 的延迟时间高于默认队列大小。例如。在生成任何数据之前,它消耗的数据超出了其他队列路径所能容纳的数据。所以两个分支互相死锁,无法预卷。
关于gstreamer - 管道未完成从 READY 到 PAUSED 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55403296/