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 명령의 결과에 없으면 드라이버가 지원하지 않는 것이므로 소스(입력/카메라) 형식에서 출력 형식으로 일부 변환을 수행해야 합니다.

관련 정보