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