次のコマンドを使用して10fpsをキャプチャし、デバイスドライバに送信しようとします。 8ビットグレーの生フレーム(640×480 = 1フレームあたり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コマンドの結果にない場合、ドライバはサポートされていないため、ソース(入力/カメラ)形式から出力形式にいくつかの変換を実行する必要があります。