为什么我可以将h264编码的视频从网络摄像头传输到BOTH显示和文件,但不是原始视频?

时间:2015-03-24 15:11:34

标签: webcam gstreamer video4linux

我想从Logitech C920网络摄像头流式传输原始视频,同时 显示并使用GStreamer 1.0将视频保存到文件。

如果我从摄像机传输h264编码的视频(摄像机提供硬件编码的h264),这是有效的,但如果我从摄像机流传输原始视频,它将失败。但是,如果我只显示或仅保存到文件,则流式传输原始视频无效。

为什么它适用于h264视频流,但不适用于原始视频流?

h264编码视频流从摄像机到BOTH显示和文件(WORKS):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-h264,width=640,height=480,framerate=15/1 ! tee name=t \
    t. ! queue ! h264parse ! avdec_h264 ! xvimagesink sync=false \
    t. ! queue ! h264parse ! matroskamux \
    ! filesink location='h264_dual.mkv' sync=false

从相机到仅显示的原始视频流(WORKS):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 \
    ! xvimagesink sync=false

从相机到ONLY文件的原始视频流(WORKS):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 \
    ! videoconvert ! x264enc ! matroskamux \
    ! filesink location='raw_single.mkv' sync=false

从相机到BOTH显示和文件的原始视频流(FAILS):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 \
    ! tee name=t \
    t. ! queue ! xvimagesink sync=false \
    t. ! queue ! videoconvert ! x264enc ! h264parse ! matroskamux \
    ! filesink location='raw_dual.mkv' sync=false

最后一个命令(显示和文件的原始视频)失败,没有任何警告或错误。 gst-launch终端输出与仅写入文件时的输出完全相同。 xvimage窗口出现并显示来自摄像机的图像,但图像不会改变(即它被冻结)。也出现零字节文件。

我已经尝试了上述命令的多个版本,但我认为这些是可以重现问题的最小命令。

有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:3)

可以将来自网络摄像头(非特定于C920)的原始视频流式传输到显示器和h.264编码文件。 x264enc属性tune需要设置为zerolatency

h.264例子:

gst-launch-1.0 -v v4l2src device=/dev/video0 \ ! video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 \ ! tee name=t t. ! queue ! xvimagesink sync=false t. ! queue ! \ videoconvert ! x264enc tune=zerolatency ! h264parse ! \ matroskamux ! filesink location='raw_dual.mkv' sync=false

或者,可以完全跳过h.264并改为编码为theora或vp8。

theora示例:

gst-launch-1.0 -v v4l2src device=/dev/video0 ! \ video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 ! \ tee name=t t. ! queue ! xvimagesink sync=false t. ! queue ! \ videoconvert ! theoraenc ! theoraparse ! \ matroskamux ! filesink location='raw_dual.mkv' sync=false

vp8示例:

gst-launch-1.0 -v v4l2src device=/dev/video0 ! \ video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 ! \ tee name=t t. ! queue ! xvimagesink sync=false t. ! queue ! \ videoconvert ! vp8enc ! \ matroskamux ! filesink location='raw_dual.mkv' sync=false

非常感谢Jan Spurny和Tim。