ffmpeg网络摄像头到设备驱动程序,输出8位灰度

ffmpeg网络摄像头到设备驱动程序,输出8位灰度

使用以下命令,我尝试捕获 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 命令的结果中,则驱动程序不支持它,因此您需要从源(输入/相机)格式到输出格式进行一些转换。

相关内容