Intereting Posts
Как создать LV Должен ли пользователь снова выйти из системы, если я изменю / etc / sudoers? Преобразовать дату строки Как заставить мой ELF работать как с новой, так и с старой версией glibc? Как заставить IP-адрес и имя хоста отображаться только как domain.com на сервере Tomcat? почему запросы с статусом «отказались» получают ответы? значение переменной оболочки для цикла, отличного от цикла изменить вход / выход gnome в качестве пользователя bash / sh для замены текста между некоторыми тегами / строками в текстовом файле Еженедельное задание cron для сохранения списка установленных пакетов Разделить одну и ту же конфигурацию виртуального хоста для нескольких файлов Почему mv намного быстрее чем cp? Как мне восстановиться после неверной команды mv? Установите конкретный выпуск точки RHEL Есть ли способ получить эффект объединения grep -v с grep -A? Можно ли управлять несколькими мониторами с одного CRTC?

ffmpeg веб-камера для драйвера устройства, выход 8-битный оттенки серого

С помощью следующей команды я пытаюсь захватить 10 кадров в секунду и отправить им драйвер устройства. Теперь я хочу, чтобы 8-битные серые необработанные кадры (640×480 = 307200 байт на кадр) отправлялись в драйвер устройства. Я не могу понять, как установить вывод с помощью ffmpeg или intput с 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, и я не могу понять, как это сделать. У меня болит голова от чтения документации: стр.

Во-первых, проверьте, что форматы пикселей поддерживаются драйвером вашего устройства вывода:

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

пиксельформат, который вы хотите передать в командную строку v4l2-ctl, – это четырехчетное число, показанное в результате, например:

 Pixel Format : 'YUYV' 

в этом случае ваша командная строка будет:

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

Если вам нужен V4L2_PIX_FMT_GREY, вероятно, четверка будет «GREY» (я думаю, из videodev2.h , не могу проверить)

Если это не результат команды list-formats, драйвер не поддерживается драйвером, поэтому вам потребуется некоторое преобразование из исходного (входного / кадрового) формата в выход.