Получение необработанных пакетов h264 с USB-камеры на Raspberry Pi - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь получить кадры H264 с веб-камеры USB, подключенной к Raspberry PI

. С помощью модуля камеры RPi я могу запустить следующую команду, чтобы получить данные H264, выводимые в stdin: raspivid -t 0 -w 640 -h 320 -fps 15 -o - с близка к нулю латентность

Есть ли эквивалентная функция для этого с камерой USB?У меня есть две USB-камеры, с которыми я хотел бы сделать это.

Используя ffprobe /dev/videoX, я получаю следующий вывод: (коротко до важных деталей):

$ ffprobe /dev/video0
...
Input #0, video4linux2,v4l2, from '/dev/video0':
Duration: N/A, start: 18876.273861, bitrate: 147456 kb/s
Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1280x720, 147456 kb/s, 10 fps, 10 tbr, 1000k tbn, 1000k tbc

$ ffprobe /dev/video1
...
Input #0, video4linux2,v4l2, from '/dev/video1':
Duration: N/A, start: 18980.783228, bitrate: 115200 kb/s
Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 800x600, 115200 kb/s, 15 fps, 15 tbr, 1000k tbn, 1000k tbc


$ ffprobe /dev/video2
...
Input #0, video4linux2,v4l2, from '/dev/video2':
Duration: N/A, start: 18998.984143, bitrate: N/A
Stream #0:0: Video: h264 (Main), yuv420p(progressive), 1920x1080, -5 kb/s, 30 fps, 30 tbr, 1000k tbn, 2000k tbc

НасколькоЯ могу сказать, что два из них не H264, который нужно будет "декодировать" до H264, поэтому я понимаю, что там добавлена ​​небольшая задержка.Но третий (video2) - это H264, поэтому я смогу получить от него данные?Я пытался просто передать это с помощью CAT, но там говорится, что у меня неверные аргументы.

Я дошел до того, что использование FFMPEG может быть единственным вариантом здесь.Хотелось бы использовать программное обеспечение, легко доступное для всех RPi (apt install).

Дополнительный вопрос, касающийся пакетов H264: Когда я передаю данные из команды raspivid в мой декодер, он работает отлично.Но если я решу отбросить 10 первых пакетов, он никогда не инициализирует процесс декодирования и просто показывает черный фон.Кто-нибудь знает, что может отсутствовать в первых пакетах, которые я мог бы воссоздать в своем программном обеспечении, поэтому мне не нужно перезапускать поток для каждого вновь подключенного пользователя?

РЕДАКТИРОВАТЬ: Бонусный вопрос Ответ: После поисков вокруг я вижу, что первые два кадра raspivid посылают мне.Таким образом, игнорируя два первых кадра, мой декодер не будет «декодировать» должным образом.Поэтому, если я сохраню эти кадры и отправлю их сначала всем новым пользователям, это будет работать отлично.Похоже, они используются в каком-то начальном процессе.

0x27 = 01 00111 = type 7    Sequence parameter set (B-frame)
0x28 = 01 01000 = type 8    Picture parameter set (B-frame)

1 Ответ

0 голосов
/ 14 июня 2018

Во-первых, давайте правильно поймем поток данных .Для камеры Raspi:

  1. Камера Raspi подключена с помощью CSI (последовательный интерфейс камеры) к Raspi.Эта ссылка содержит несжатые необработанные данные изображения.

  2. raspivid обращается к встроенному графическому процессору Raspi для доступа к данным изображения, а также просит графический процессор выполнить H.Кодирование 264, которое всегда добавляет некоторую задержку (вы можете использовать raspiyuv для получения необработанных несжатых данных, возможно, с меньшей задержкой).

Веб-камеры USB обычно передают без сжатия,необработанные данные изображения.Но некоторые также передают данные в кодировке H.264 или jpeg.

Далее, Видео для Linux API версии 2 не было создано для конвейеров оболочки, так что вы можете 'получить данные из / dev / videoX с помощью cat.Вам нужен код для выполнения вызовов IOCTL, чтобы договориться о том, что и как считывать данные с устройства.ffmpeg делает именно это.

Что касается вашего бонусного вопроса, вы можете попробовать - встроенный параметр raspivid, который заставляет поток включать заголовки PPS и SPS в каждый I-кадр.

Далее, вывод данных H.264 из ffmpeg с использованием -f rawvideo выглядит для меня неправильно, поскольку rawvideo означает несжатое видео.Вместо этого вы можете попробовать -f h264 для принудительного использования необработанного формата видеовыхода H.264:

ffmpeg -i /dev/video2 -c copy -f h264 pipe:1

Наконец, вы действительно хотите получить поток H.264 с веб-камеры USB..Поскольку данные изображения поступают с камеры без сжатия, сначала они должны быть закодированы в H.264.Разумным вариантом на Raspi является использование аппаратного кодера, поскольку использование программного кодера, такого как x264, потребляет слишком много ресурсов ЦП.

Если у вас есть ffmpeg, настроенный с использованием - enable-mmal и / или - enable-omx-rpi , вы можете использовать ffmpeg для связи с аппаратным кодером H.264.

В противном случае взгляните на gstreamer и его omxh264enc элемент, например. здесь .gstreamer также может общаться с устройствами v4l2 .

...