我正在尝试构建一个 gstreamer 管道,该管道从 h264 USB 摄像头获取视频流并对其进行处理(将其显示在屏幕上,将其记录到文件等)。如果管道中发生错误,我想将其打印出来并终止管道。例如:如果 USB 摄像头被拔掉,管道应该终止,并且应该打印出一条错误消息。
使用以下简单管道可以按需要工作:
gst-launch-1.0 v4l2src device=/dev/video2 ! decodebin ! autovideosink
管道显示视频,当我拔下相机时,管道终止并打印以下输出:
v4l2src0:
Error: gst-resource-error-quark: Could not read from resource. (9)
Debug: gstv4l2bufferpool.c(1040): gst_v4l2_buffer_pool_poll (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
poll error 1: Resource temporarily unavailable (11)
当我构建一个更复杂的管道(满足我的需要)时,我发现错误消息没有通过管道传播,因此它没有终止管道。我将其缩小到“麻烦制造者”元素,结果是队列元素。
以下管道不再按预期工作:
gst-launch-1.0 v4l2src device=/dev/video2 ! queue ! decodebin ! autovideosink
拔下摄像头时,视频显示会无限期冻结,而不会终止管道。
这是正常行为吗?我错过了什么?有解决方法吗?
PS.:我尝试使用标识元素及其error-after属性来模拟错误消息。
gst-launch-1.0 v4l2src device=/dev/video2 ! identity error-after=60 ! queue ! decodebin ! autovideosink
此管道也可以按需要工作,这意味着它会因相关错误消息而终止。