Потоковая H264 с Logitech C920

13

У меня есть веб-камера Logitech C920. Он имеет возможность напрямую кодировать видео в H264.

Я хочу воспроизвести то, что было сделано с Beaglebone, но с использованием Raspberry Pi: отправить поток H264 в сеть . Тогда Raspberry Pi предназначен только для упаковки потока в RTP, сжатие видео выполняется самой веб-камерой. Режим H264 обеспечивается с использованием video4linux.

Пока, и если я использую обычный компьютер с последней версией Ubuntu, он работает с использованием VLC в качестве сервера или GStreamer. Например, если я запускаю на Raspberry Pi сервер VLC, используя команду:

cvlc --sout=#rtp{sdp=rtsp://:8554/test} 'v4l2:///dev/video0:chroma=H264:width=800:height=600:fps=30'

... а затем, если я читаю поток с VLC на другом компьютере, все в порядке.

Однако, если я использую Raspberry Pi для отправки видеопотока, результат довольно плохой. Много мусора на изображении, как только что-то движется. Ключи изображений хорошо принимаются каждые 10 секунд, но в то же время они недостаточно хороши по сравнению с потоком с обычного компьютера.

Я также попробовал метод, описанный для beaglebone, с помощью предоставленной утилиты захвата : хорошо, если я смотрю с реального компьютера, та же проблема с мусором, если я смотрю с Raspberry Pi.

Это не проблема сети: я провел некоторые проверки сети с Wireshark и статистикой VLC, у меня нет потери пакетов. Я пробовал использовать Raspbian и Arch Linux для Raspi (gstreamer 0.10 в raspbian, gstreamer 1.0 в Arch Linux).

Я не знаю, уместно это или нет, но я также тестировал версию Raspbian с поддержкой float. Сначала необходимо выполнить обновление, чтобы использовать ядро ​​3.2; но та же проблема, видео имеет какой-то мусор.

Есть идеи о том, что я могу сделать, чтобы улучшить качество видео?

Винсент Хирибаррен
источник
Попробуйте уменьшить частоту кадров. Процессор rPi очень плохой, поэтому я думаю, что передача изображения 800x600 со скоростью 30 кадров в секунду - это слишком много. Только новая плата камер rPI, подключенная через разъем MIPI / CIS (вместо USB), передает 1080p при 15-30 FPS.
Матиас
Это не FPS. Pi может обрабатывать HD со скоростью 60FPS без проблем, используя модуль Pi Camera. Если камера Logitech отправляет видео H264, оно уже закодировано, и Pi должен повторно передать пакеты ..., на которые он полностью способен. Фактически он может ретранслировать до 6 потоков HD @ 25FPS до того, как достигнет максимума. Должно быть, драйвер V4L портит пакеты
Петр Кула
Я знаю, что это старая тема, но вы, наконец, нашли что-то, что работает? Я пытаюсь сделать что-то подобное и застрял
Аджит
Я использовал Beaglebone, и он работал лучше. Проблема была из-за плохого USB-драйвера для RaspberryPi в Raspbian. Насколько я помню, позже я тестировал ту же систему с более поздней версией Raspbian, и у меня было меньше мусора. Я мог сделать rpi-обновление (как сказано в одном из ответов), но я плохо помню. Но что точно, так это производительность стала лучше после использования обновленной прошивки / операционной системы.
Винсент Хирибаррен
Винсент, я получаю сообщение об ошибке «Не удается открыть v4l2 URL». Эта команда сейчас устарела?
Даланмиллер

Ответы:

5

У меня была такая же проблема, нашел эту ветку при поиске аппаратного кодера, а не проблем с920.

Тем не менее, выполните обновление прошивки для Raspberry Pi и мусор должен быть удален

$> sudo rpi-update

Я сам нашел решение здесь: http://wiki.matthiasbock.net/index.php/Logitech_C920,_streaming_H.264#Raspberry_Pi

Штеффен
источник
Чтобы закрыть этот вопрос, я принимаю этот ответ. Проблема была из-за сломанного драйвера USB, в связи USB произошла потеря пакетов. Обновленная система / прошивка должна сделать свое дело.
Винсент Хирибаррен
2

Вы можете попробовать и использовать FFMPEG. Но проблема не в том, чтобы использовать версию репозитория, потому что она устарела. Есть раздвоенная версия, которая работает очень хорошо.

Вам придется скомпилировать его, что займет около 5 часов или загрузить предварительно скомпилированный двоичный файл.

Затем вы можете передать данные из драйвера V4L в FFMPEG с этими настройками. Где -i "fifo"должно быть просто, -iчтобы захватить поток по каналу, и -fвам нужно будет дважды проверить, как вывести его H264. FLV перепаковывает его в FLV, в который можно играть с HTML-плеерами.

ffmpeg -y \  
  -f h264 \  
  -i "$fifo" \  
  -c:v copy \  
  -map 0:0 \  
  -f flv "$urllocal"   

или пример, который я обнаружил, который нацелен на V4L напрямую, но у вас должна быть камера, /dev/video* где * 1или больше ...

ffmpeg -f video4linux2 -r 25 -s 640x480 -i /dev/video0 out.avi

-fобозначает формат для вывода. Это не означает , что она будет перекодировать его как H264 в FLV просто получает завернутый в формате FLV. затем измените адрес вашего клиента VLC player. например-f mpegts udp:192.168.1.19:1234

VLC, кажется, не слишком хорошо работает на Pi. У меня был очень небольшой успех при установке модуля Pi cmaera на мой компьютер с использованием UDP. Это сработало, но не было стабильным.

Вы также можете посмотреть на установку nginx с модулем rtmp, который работает. Посмотрите это руководство, но вам нужно немного подправить настройки. Затем вы подключаете проигрыватель VLC к потоку nginx-rtmp, и он будет работать как шарм.

Петр Кула
источник
1
Какая разветвленная версия подходит?
Брайан
1

Кажется, это работает для меня @ минимум ... cvlc v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=640 :v4l2-height=480 --sout="#transcode{vcodec=h264,vb=800,scale=1,acodec=mp4a,ab=128,channels=2,samplerate=44100}:rtp{sdp=rtsp://:8554/live.ts}" -I dummy

Филипп Гачу
источник
0

Попробуйте с большим буфером на клиенте, отображающем видео. Для меня есть существенная разница между буфером 1000 мс и буфером 200 мс. Буфер 5000 мс выглядит лучше, чем буфер 1000 мс.

: Сетевое кэширование = 2000

Оди
источник
Он должен работать с 0 кешированием с нечетным дрожанием в локальной сети. Я получил модуль камеры Pi, чтобы работать без проблем.
Петр Кула
0

Я опубликовал возможное решение на малиновом форуме с использованием облегченного RTSP-сервера на основе live555, который захватывает H264 из драйвера V4L2. Это доступно от github h264_v4l2_rtspserver

Это было сделано для распикамера, но оно должно работать с любым устройством V4L2, которое обеспечивает H264.

mpromonet
источник
-1

Если я хорошо понял вашу ситуацию, вы хотите, чтобы Raspberry транскодировал видео в H264? Я думаю, именно поэтому вы получаете плохую производительность, потому что VLC использует программное кодирование, а Raspberry не подходит для этой задачи.

Я бы предложил попробовать с Gstreamer и gst-omxплагинами . Есть элемент для аппаратного кодирования видео, который сделает хороший сервер из вашего Raspberry.

10robinho
источник
1
По его словам, камера Logitech уже обеспечивает H.264. Таким образом, RPI только транспортирует кадры, но не выполняет никакого кодирования.
Матиас
Он не транскодирует. Просто ретрансляция данных. Так как в нем используется поток напрямую.
Петр Кула