为什么我可以将 h264 编码视频从网络摄像头传输到显示器和文件,但不能传输原始视频?
Why can I stream h264 encoded video from webcam to BOTH display and file, but NOT raw video?
我想从 Logitech C920 网络摄像头流式传输原始视频,同时 使用 GStreamer 1.0 显示视频并将其保存到文件中。
如果我从摄像头流式传输 h264 编码视频(摄像头提供硬件编码的 h264),这会起作用,但如果我从摄像头流式传输原始视频,它就会失败。但是,如果我只显示或只保存到文件,流式传输原始视频就可以了。
为什么它适用于 h264 视频流但不适用于原始视频流?
从摄像头到显示器和文件的 h264 编码视频流(有效):
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
从相机到唯一文件的原始视频流(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
从相机到显示器和文件的原始视频流(失败):
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 window 出现并显示来自相机的图像,但图像没有改变(即它被冻结)。也出现零字节文件。
我已经尝试了上述命令的多个版本,但我认为这些是可以重现问题的最少命令。
有人知道我做错了什么吗?
可以将来自网络摄像头(并非特定于 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。
理论示例:
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。
我想从 Logitech C920 网络摄像头流式传输原始视频,同时 使用 GStreamer 1.0 显示视频并将其保存到文件中。
如果我从摄像头流式传输 h264 编码视频(摄像头提供硬件编码的 h264),这会起作用,但如果我从摄像头流式传输原始视频,它就会失败。但是,如果我只显示或只保存到文件,流式传输原始视频就可以了。
为什么它适用于 h264 视频流但不适用于原始视频流?
从摄像头到显示器和文件的 h264 编码视频流(有效):
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
从相机到唯一文件的原始视频流(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
从相机到显示器和文件的原始视频流(失败):
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 window 出现并显示来自相机的图像,但图像没有改变(即它被冻结)。也出现零字节文件。
我已经尝试了上述命令的多个版本,但我认为这些是可以重现问题的最少命令。
有人知道我做错了什么吗?
可以将来自网络摄像头(并非特定于 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。
理论示例:
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。