2015-12-04 3 views
2

Я пытаюсь передать видео с веб-камеры с малины на плеер VLC с помощью gstreamer 1.0. Сейчас я получил следующую команду для Малина:GStreamer - поток веб-камеры от малины до VLC-ПК

gst-launch-1.0 -vv -e v4l2src device=/dev/video0 \ 
! videoscale \ 
! "video/x-raw,width=352,height=288,framerate=10/1" \ 
! queue \ 
! x264enc \ 
! h264parse \ 
! rtph264pay config-interval=10 pt=96 \ 
! udpsink host=239.255.12.42 port=5004 

И следующий SDP файл для воспроизведения потока с VLC:

c=IN IP4 239.255.12.42 
m=video 5004 RTP/AVP 96 
a=rtpmap:96 H264/90000 

Когда я запустить GST-запуск-1.0 команды я могу см. с wirehark, что он отправляет пакеты udp, но когда я пытаюсь воспроизвести поток с помощью vlc и sdp-файла, я ничего не получаю. В журнале vlc говорится:

es error: cannot peek 
es error: cannot peek 
live555 error: no data received in 10s, aborting 

Я не знаю, что случилось. Я, вероятно, не правильно построил конвейер, и поэтому vlc не распознает поток как правильный поток видео. Есть идеи?

Заранее за вашу помощь.

+0

делает одноадресную работу для вас - попробуйте 'host = 127.0.0.1' – nayana

+0

Спасибо за ваш ответ @otopolsky. Я попытался и да, теперь он показывает некоторые изображения ... но это невероятно медленно. В журнале vlc говорится: «Основная ошибка: ES_OUT_SET_ (GROUP_) ПЦР вызвана слишком поздно (pts_delay увеличено до 567 мс) Основная ошибка: ES_OUT_RESET_PCR под названием avcodec error: более 5 секунд позднего видео -> кадр снизу (компьютер слишком медленный?) '. Может быть, h264 слишком много для малины. Я пытаюсь найти кодировщик, который не нуждается в такой большой мощности от малины. Пока не повезло. – DaveCode

+0

как насчет установки более быстрой настройки на x264enc? попробуйте 'speed-preset = 2' или вы можете попробовать даже' tune = zerolatency' – nayana

ответ

3

VLC понимает поток Ts в сочетании с протоколом RTP. Подходом является использование rtp payloader после mpegtsmux, который будет загружать генерируемые ts-буферы (пакеты).

Таким образом, вместо этого:

src ! queue ! x264enc ! h264parse ! rtph264pay ! udpsink 

Вы можете сделать это:

src ! queue ! x264enc ! h264parse ! mpegtsmux ! rtpmp2tpay ! udpsink 

И затем использовать только rtp://@:port в VLC Таким образом mpegtsmux будет инкапсулировать информация о what streams does it contains

Следует отметить, что Ваш подход неверный, и (mpegtsmux будет обрезать видео в 188 байт-пакетов, но ваш подход будет разбит на ~ 1400 байтов udp-пакетов), но вам нужно предоставить правильный SDP-файл для vlc, чтобы передать его. Например, как this, но у меня нет большого опыта работы с этим ..

Так это текущая труба, которая работает:

gst-launch-1.0 -vv -e v4l2src device=/dev/video0 ! "video/x-raw,width=352,height=288,framerate=25/1"\ ! queue ! x264enc speed-preset=1 ! h264parse ! mpegtsmux ! rtpmp2tpay ! udpsink host=192.255.10.41 port=5004 

Вы можете возможно достичь лучших результатов при использовании zerolatency:

например, x264enc tune=4 он отбросит все другие параметры качества, такие как скорость-пресет и т. д.

Это из документов об изменении свойства:

tune : Preset name for non-psychovisual tuning options 
     flags: readable, writable 
     Flags "GstX264EncTune" Default: 0x00000000, "(none)" 
     (0x00000001): stillimage  - Still image 
     (0x00000002): fastdecode  - Fast decode 
     (0x00000004): zerolatency  - Zero latency 
+0

Отличное объяснение! Теперь я обнаружил, что часть mpegtsmux разрезается лучше! Несмотря на повторяемость, спасибо @otopolsky! – DaveCode