ffmpeg Webカメラをデバイスドライバとして、8ビットグレースケール出力

ffmpeg Webカメラをデバイスドライバとして、8ビットグレースケール出力

次のコマンドを使用して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コマンドの結果にない場合、ドライバはサポートされていないため、ソース(入力/カメラ)形式から出力形式にいくつかの変換を実行する必要があります。

関連情報