使用以下命令,我尝试捕获 10fps 并向它们发送设备驱动程序。现在我想要将 8 位灰色原始帧(640x480= 每帧 307200 字节)发送到设备驱动程序。我不知道如何将 ffmpeg 的输出或 v4l2 的输入设置为这种格式。
ffmpeg -f v4l2 -r 25 -s 640x480 -i /dev/video0 -f rawvideo "/dev/devicedriver"
ffmpeg似乎不支持8位灰度输出。对于 v4l2,我不知道如何设置它。它似乎无法识别V4L2_PIX_FMT_GREY。
v4l2-ctl --set-fmt-video-out=width=640,height=480,pixelformat=V4L2_PIX_FMT_GREY
我想出了一个结合 python、opencv 和 ffmpeg 的解决方案:
import cv
import sys
import os
import time
camera_index = 0
capture = cv.CaptureFromCAM(camera_index)
count = 0
def repeat():
global capture
global camera_index
global count
frame = cv.GetMat(cv.QueryFrame(capture))
framegray = cv.CreateMat(480, 640, cv.CV_8UC1)
cv.CvtColor(frame, framegray, cv.CV_BGR2GRAY)
sys.stdout.write(framegray.tostring())
c = cv.WaitKey(1)
if c == 27:
print count
sys.exit()
while True:
repeat()
然后通过管道将其传输到 ffmpeg
python capturewebcam.py | ffmpeg -f rawvideo -pix_fmt gray -s 640x480 -i - -an -f rawvideo -r 10 "/dev/null"
但我认为仅使用 ffmpeg 和 v4l2 就可以实现这一点,但我不知道如何实现。阅读文档后我的头很痛:p。
答案1
首先,检查输出设备驱动程序是否支持像素格式:
v4l2-ctl --list-formats -d /dev/devicedriver
您想要传递给 v4l2-ctl 命令行的像素格式是结果中显示的 fourcc,例如:
Pixel Format : 'YUYV'
在这种情况下,您的命令行将是:
v4l2-ctl --set-fmt-video-out=width=640,height=480,pixelformat=YUYV
如果您需要 V4L2_PIX_FMT_GREY 可能 fourcc 将是“GREY”(我猜从视频开发2.h,无法检查)
如果它不在 list-formats 命令的结果中,则驱动程序不支持它,因此您需要从源(输入/相机)格式到输出格式进行一些转换。