Python
ffmpeg網路攝像頭到設備驅動,輸出8位灰度
使用以下命令,我嘗試擷取 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 命令的結果中,則驅動程序不支持它,因此您需要從源(輸入/相機)格式到輸出的一些轉換。