С помощью следующей команды я пытаюсь захватить 10 кадров в секунду и отправить им драйвер устройства. Теперь я хочу, чтобы 8-битные серые необработанные кадры (640×480 = 307200 байт на кадр) отправлялись в драйвер устройства. Я не могу понять, как установить вывод с помощью ffmpeg или intput с 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, и я не могу понять, как это сделать. У меня болит голова от чтения документации: стр.
Во-первых, проверьте, что форматы пикселей поддерживаются драйвером вашего устройства вывода:
v4l2-ctl --list-formats -d /dev/devicedriver
пиксельформат, который вы хотите передать в командную строку v4l2-ctl, – это четырехчетное число, показанное в результате, например:
Pixel Format : 'YUYV'
в этом случае ваша командная строка будет:
v4l2-ctl --set-fmt-video-out=width=640,height=480,pixelformat=YUYV
Если вам нужен V4L2_PIX_FMT_GREY, вероятно, четверка будет «GREY» (я думаю, из videodev2.h , не могу проверить)
Если это не результат команды list-formats, драйвер не поддерживается драйвером, поэтому вам потребуется некоторое преобразование из исходного (входного / кадрового) формата в выход.