Python

ffmpeg網路攝像頭到設備驅動,輸出8位灰度

  • August 11, 2013

使用以下命令,我嘗試擷取 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。

首先,檢查您的輸出設備驅動程序是否支持像素格式:

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”(我猜來自videodev2.h,無法檢查)

如果它不在 list-formats 命令的結果中,則驅動程序不支持它,因此您需要從源(輸入/相機)格式到輸出的一些轉換。

引用自:https://unix.stackexchange.com/questions/85849