ffmpeg webcam para o driver do dispositivo, saída em escala de cinza de 8 bits

2

Com o seguinte comando eu estou tentando capturar 10fps e enviar-lhes o driver de dispositivo. Agora eu quero quadros em bruto cinza de 8 bits (640x480 = 307200 bytes por quadro) para ser enviado para o driver de dispositivo. Eu não consigo descobrir como definir a saída com ffmpeg ou a intput com v4l2 para este formato.

ffmpeg -f v4l2 -r 25 -s 640x480 -i /dev/video0 -f rawvideo "/dev/devicedriver"

O ffmpeg não parece suportar saída em cinza de 8 bits. E com v4l2 eu não consigo descobrir como configurá-lo. Parece que não reco nhece V4L2_PIX_FMT_GREY.

v4l2-ctl --set-fmt-video-out=width=640,height=480,pixelformat=V4L2_PIX_FMT_GREY

Eu criei uma solução combinando python, opencv e 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()

e depois canalizá-lo para ffmpeg

python capturewebcam.py | ffmpeg -f rawvideo -pix_fmt gray -s 640x480 -i - -an -f rawvideo -r 10 "/dev/null"

Mas eu acho que realmente tem que ser possível apenas com ffmpeg e v4l2, e não consigo descobrir como. Minha cabeça dói de ler a documentação: p.

    
por mgoubert 07.08.2013 / 18:06

1 resposta

1

Primeiro, verifique se os formatos de pixel são suportados pelo seu driver de dispositivo de saída:

v4l2-ctl --list-formats -d /dev/devicedriver

o formato de pixel que você quer passar para a linha de comando v4l2-ctl é o fourcc mostrado no resultado, por exemplo:

Pixel Format  : 'YUYV'

neste caso, sua linha de comando seria:

v4l2-ctl --set-fmt-video-out=width=640,height=480,pixelformat=YUYV

Se você precisar de V4L2_PIX_FMT_GREY, provavelmente o fourcc será 'GRAY' (eu acho que de videodev2.h , não posso verificar)

Se não estiver no resultado do comando list-formats, ele não será suportado pelo driver, então você precisará de alguma conversão do formato de fonte (entrada / câmera) para a saída.

    
por 11.08.2013 / 02:28