Вопрос или проблема
Я пытаюсь настроить плату Raspberry Pi как устройство для передачи данных, которое могло бы получать видео с камеры или другого источника и передавать его на основной ПК. Я следую уроку, упомянутому здесь
https://gist.github.com/justinschuldt/36469e2a89d95ef158a8c4df091e9cb4
Мне удалось успешно транслировать видео с веб-камеры на основной ПК. Я хотел использовать видеофайл вместо потока с веб-камеры. Чтобы это сделать, я сделал следующее
- Создал фиктивное устройство v4l2loopback
- Создал uvc_gadget, следуя вышеупомянутому уроку
Моя настройка выглядит следующим образом
pi@raspberrypi:~ $ v4l2-ctl --list-devices fe980000.usb (gadget):
/dev/video1
bcm2835-codec-decode (platform:bcm2835-codec):
/dev/video10
/dev/video11
/dev/video12
mmal service 16.1 (platform:bcm2835-v4l2):
/dev/video0
Dummy video device (0x0000) (platform:v4l2loopback-000):
/dev/video2
После этого я смог запустить uvc_gadget следующим образом
pi@raspberrypi:~ $ ~/uvc-gadget/uvc-gadget -d /dev/video2 -u /dev/video1 -r 1 -f 1
uvc device is fe980000.usb on bus gadget
uvc open succeeded, file descriptor = 3
control request (req 86 cs 02)
control request (req 86 cs 02)
streaming request (req 87 cs 01)
streaming request (req 01 cs 01)
setting probe control, length = 26
streaming request (req 81 cs 01)
Теперь, когда я попытался транслировать видеофайл на /dev/video2, я получил только цветные полосы на основном ПК с ошибкой “не найдено данных JPEG”
pi@raspberrypi:~ $ ffmpeg -re -i file_example_MP4_480_1_5MG.mp4 -map 0:v -f v4l2 /dev/video2
ffmpeg version 4.1.4-1+rpt7~deb10u1 Copyright (c) 2000-2019 the FFmpeg developers
На основном ПК я проверил, какие видео устройства были доступны мне
zain@zain-Creator-17M-A10SD:~$ v4l2-ctl --list-devices
Dummy video device (0x0000) (platform:v4l2loopback-000):
/dev/video2
PI4 USB Device: UVC Camera (usb-0000:00:14.0-4):
/dev/video0
/dev/video1
RPI4 отображался как UVC-камера.
Я пытался прочитать видео устройство с помощью ffplay, но не было потока, только ошибка.
zain@zain-Creator-17M-A10SD:~$ ffplay /dev/video0
ffplay version 3.4.8-0ubuntu0.2 Copyright (c) 2003-2020 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --prefix=/usr --extra-version=0ubuntu0.2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
[mjpeg @ 0x7fecf40020e0] No JPEG data found in image= 0B f=0/0
[mjpeg @ 0x7fecf40020e0] No JPEG data found in image= 0B f=0/0
[video4linux2,v4l2 @ 0x7fecf4000b80] decoding for stream 0 failed
[video4linux2,v4l2 @ 0x7fecf4000b80] Could not find codec parameters for stream 0 (Video: mjpeg, none(bt470bg/unknown/unknown), 1280x720): unspecified pixel format
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, video4linux2,v4l2, from '/dev/video0':
Duration: N/A, start: 331989.158354, bitrate: N/A
Stream #0:0: Video: mjpeg, none(bt470bg/unknown/unknown), 1280x720, 0.20 fps, 0.20 tbr, 1000k tbn, 1000k tbc
[mjpeg @ 0x7fecf40044c0] No JPEG data found in image
Last message repeated 2 times
[mjpeg @ 0x7fecf40044c0] No JPEG data found in image= 0B f=0/0
[mjpeg @ 0x7fecf40044c0] No JPEG data found in image= 0B f=0/0
[mjpeg @ 0x7fecf40044c0] No JPEG data found in image= 0B f=0/0
[mjpeg @ 0x7fecf40044c0] No JPEG data found in image= 0B f=0/0
[mjpeg @ 0x7fecf40044c0] No JPEG data found in image= 0B f=0/0
[mjpeg @ 0x7fecf40044c0] No JPEG data found in image= 0B f=0/0
[mjpeg @ 0x7fecf40044c0] No JPEG data found in image= 0B f=0/0
Я получаю почти такое же поведение, если создаю гаджет с использованием g_webcam вместо configFS, но в этом случае я получаю полосы вместо этой ошибки.
Буду благодарен за любую помощь. Я предполагаю, что есть некоторые проблемы с кодированием.
Потому что uvc-gadget
не поддерживает размер вашего mp4.
ffmpeg -re -i /home/pi/test.mp4 -vf scale=640:480 -map 0:v -f v4l2 /dev/video0
Ответ или решение
К сожалению, возникли проблемы с передачей видеопотока с Raspberry Pi на ваш хост ПК через устройство uvc_gadget
. Из представленной информации видно, что вы успешно создали эмулятор видеоустройства с помощью v4l2loopback
и запустили uvc_gadget
, но при отправке видеофайла возникают артефакты и ошибки.
Проблема с кодированием и совместимостью
Основной причиной, по которой вы сталкиваетесь с проблемами, скорее всего, является несовместимость формата видеофайла, который вы используете. Установленный вами видеофайл в формате MP4, возможно, использует кодек, который не поддерживается uvc_gadget
для передачи. Приложение uvc_gadget
ожидает видеопоток в формате MJPEG, поэтому для успешной передачи видеофайла, вам необходимо транскодировать его в подходящий формат.
Решение
Следующие шаги могут помочь вам исправить ситуацию:
-
Транскодирование видео: Используйте
ffmpeg
для изменения параметров вашего видеофайла, чтобы он подходил для передачи черезuvc_gadget
. Например, вы можете использовать следующий код:ffmpeg -re -i file_example_MP4_480_1_5MG.mp4 -vf "scale=640:480" -pix_fmt yuvj420p -f v4l2 /dev/video2
Дополнительные опции, такие как
-vf
для масштабирования и-pix_fmt
для установки формата пикселей, могут помочь. -
Проверьте устройство: Убедитесь, что вы правильно направляете вывод на устройство
/dev/video2
, которое вы создали с помощьюv4l2loopback
. Вы можете использовать командуv4l2-ctl --list-formats-ext
для проверки доступных форматов на этом устройстве. -
Настройка
uvc_gadget
: Убедитесь, что вы правильно настроили параметры запускаuvc_gadget
. Возможно, нужно ознакомиться с документацией для уточнения параметров, отвечающих за качество и разрешение видео. -
Мониторинг на стороне хоста: Включите отладку на стороне хоста, чтобы получить более подробную информацию об ошибках. Используйте
ffplay
с увеличенными значениями параметровanalyzeduration
иprobesize
, что может помочь лучше обрабатывать видеопоток:ffplay -analyzeduration 1000000 -probesize 1000000 /dev/video0
Заключение
Если вы выполните вышеприведённые шаги, это должно помочь вам решить проблему с видео. Кодирование в совместимые форматы и правильная настройка устройств являются ключевыми факторами успеха в этой задаче. Не забывайте проверять документацию и обновления для ffmpeg
и uvc_gadget
, так как улучшения и новые функции могут значительно упростить этот процесс. Удачи в настройке вашей системы!