Проблема с объединением видео и аудио потока с устройства USB - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть два USB-устройства, подключенных к RPi, оба отображаются как обычно как / dev / video0. Вот некоторая дополнительная информация, поступающая с двух входов командной строки:

Устройство 1, только видео (подключено к RPi4):

ffmpeg -f v4l2 -list_formats all -i /dev/video0 отчеты

[video4linux2,v4l2 @ 0xe5e1c0] Compressed:       mjpeg :
Motion-JPEG : 1280x720 640x480 320x240

v4l2-ctl --list-formats-ext сообщает

ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture
        [0]: 'MJPG' (Motion-JPEG, compressed)
                Size: Discrete 1280x720
                        Interval: Stepwise 0.033s - 0.033s with step 0.000s
(30.000-30.000 fps)
                Size: Discrete 640x480
                        Interval: Stepwise 0.033s - 0.033s with step 0.000s
(30.000-30.000 fps)
                Size: Discrete 320x240
                        Interval: Stepwise 0.033s - 0.033s with step 0.000s
(30.000-30.000 fps)

Работает: ffmpeg -f v4l2 -i /dev/video0 -vcodec h264_omx -preset ultrafast -tune zerolatency -g 300 -b:v 1M -mpegts_service_type advanced_codec_digital_hdtv -f mpegts udp://OtherMachine:Port?pkt_size=1316

Устройство 2, видео и аудио (подключено к RPi3, но не работает на RPi4):

ffmpeg -f v4l2 -list_formats all -i /dev/video0 отчеты

[video4linux2,v4l2 @ 0x2c41210] Compressed:       mjpeg :
Motion-JPEG : 1920x1080 1280x720

v4l2-ctl --list-formats-ext отчеты

ioctl: VIDIOC_ENUM_FMT
               Index       : 0
               Type        : Video Capture
               Pixel Format: 'MJPG' (compressed)
               Name        : Motion-JPEG
                              Size: Discrete 1920x1080
                                            Interval: Discrete 0.033s
(30.000 fps)
                                            Interval: Discrete 0.067s
(15.000 fps)
                              Size: Discrete 1280x720
                                            Interval: Discrete 0.033s
(30.000 fps)
                                            Interval: Discrete 0.067s
(15.000 fps)

После довольно утомительной работы и слишком много часов я запустил эту работу:

Только видео : ffmpeg -f v4l2 -input_format mjpeg -i /dev/video0 -c:v copy -preset ultrafast -tune zerolatency -g 300 -f matroska udp://OtherMachine:Port?pkt_size=1316

Не работает вообще: ffmpeg -f v4l2 -input_format mjpeg -i /dev/video0 -c:v copy -preset ultrafast -tune zerolatency -g 300 -f mpegts udp://OtherMachine:Port?pkt_size=1316, в "OtherMachine" я вижу, что есть входящий поток данных через VL C, но он не может быть переварен должным образом.

Только аудио: ffmpeg -f alsa -thread_queue_size 1024 -i plughw:1 -c:a mp2 -ac 2 -ar 44100 -preset ultrafast -tune zerolatency -b:a 128K -f mpegts udp://OtherMachine:Port?pkt_size=1316

Но это тоже не работает:

ffmpeg -f v4l2 -input_format mjpeg -i /dev/video0 -f alsa -thread_queue_size 1024 -i plughw:1 -c:v copy -c:a mp2 -ac 2 -ar 44100 -preset ultrafast -tune zerolatency -g 300 -b:a 128K -f mpegts udp://OtherMachine:Port?pkt_size=1316

Не могли бы вы дать подсказку о том, как получить эти два потоки для устройства 2 работают вместе? Оба они получены от одного и того же оборудования / устройства, я предполагаю, что видеопоток MJPG каким-то образом не полностью соответствует стандарту mpegts (как и для устройства 1), поскольку он работает с matroska, но не с mpegts. Может ли это быть? Что нужно сделать в этом случае?

Еще один совет, с такой же настройкой оборудования, как я могу это сделать

cvlc -vvv v4l2:///dev/video0 --input-slave=alsa://plughw:1,0 --sout='#transcode{acodec=mpga,ab=128}:std{access=http,mux=asf,dst=:Port}'

Итак, мое понимание это видео передается без изменений (mjpeg), а аудио транскодируется через mpga vl c, что, по-видимому, соответствует mp2 для ffmpeg. Формат контейнера asf, но я не смог запустить его с помощью ffmpeg без видимой причины. В любом случае, захват этого широковещательного потока vl c через http://StreamingMachine: порт на любом другом компьютере в моей сети работает нормально. Но как этого добиться с помощью ffmpeg напрямую и, возможно, не как http: //, а как udp: // или pipe pipe?

В качестве альтернативы, позвольте мне задать этот вопрос: учитывая, что у меня также есть входящий видеопоток mjpeg в качестве входящего аудиопотока в формате mp2, какой формат контейнера (хорошо, это явно не mpegts) является наиболее подходящим для объединения потоков через мою локальную сеть или даже в канал для дальнейшей обработки? Поверьте мне, я старался изо всех сил в течение нескольких часов, чтобы выяснить, как действовать, но безуспешно. По крайней мере, насколько мне известно, нет ничего такого, как таблица с ответами на вопросы такого рода.

Я был бы рад получить некоторые идеи.

Лучший

...