Сучасний спосіб передавати H.264 з Raspberry Cam


16

Я отримав Pi B + та Pi-камеру, і зараз я намагаюся знайти найбільш ефективну (низький процесор) та конфігурацію з найнижчою затримкою для передачі відео, закодованого H.264, з камери на домашній сервер.

Я читав наступне:

  1. http://pi.gbaman.info/?p=150

  2. http://blog.tkjelectronics.dk/2013/06/how-to-stream-video-and-audio-from-a-raspberry-pi-with-no-latency/comment-page-1/#comments

  3. http://www.raspberrypi.org/forums/viewtopic.php?p=464522

(Усі посилання використовують gstreamer-1.0 від deb http://vontaene.de/raspbian-updates/ . main.)

Протягом останніх років було зроблено багато з цього приводу.

Спочатку нам довелося передати висновок raspividв gst-launch-1.0(див. Посилання 1).

Тоді (посилання 2) був створений офіційний драйвер V4L2, який тепер є стандартним, і він дозволяє безпосередньо отримувати дані без труби, використовуючи просто gstreamer (див. Особливість повідомлення від towolf »Понеділок 07.12.2013 15:34 за посиланням 2):

Відправник (Pi): gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=192.168.178.20 port=5000

Одержувач: gst-launch-1.0 -v udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false

Якщо я правильно розумію, обидва способи використовують графічний процесор для декодування H264, але останній трохи ефективніший, оскільки йому не потрібно проходити через ядро ​​в інший раз, оскільки між процесами немає жодної труби.


Зараз у мене є питання з цього приводу.

  1. Це останній все-таки останній спосіб ефективного отримання H264 з камери? Я читав про те gst-omx, що дозволяє набороти трубопроводи gstreamer ... video/x-raw ! omxh264enc ! .... Це робить щось інше, ніж просто використання video/x-h264, чи може бути навіть більш ефективним? Яка різниця?

  2. Як дізнатися, який плагін для кодування gstreamer насправді використовується, коли я використовую video/x-h264 ...конвеєр? Це, здається, просто вказує потрібний мені формат порівняно з іншими частинами конвеєра, де я чітко називаю (код) компонент (як h264parseабо fpsdisplaysink).

  3. У цій відповіді на посилання 1 Мікаел Лепісте згадує "Я видалив один непотрібний фільтр із потокової сторони" , це означає, що він вирізав gdppayі gdpdepay. Що вони роблять? Для чого вони потрібні? Чи можу я їх справді зняти?

  4. Він також зазначає, що, вказавши caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96"параметри для udpsrcприймальної сторони, він може запустити / відновити потокове передачу в середині потоку. Чого досягають ці шапки, чому ці конкретні варіанти, де я можу прочитати більше про них?

  5. Коли я роблю те, що пропонується у питаннях 3 та 4 (додаючи caps, відміняючи gdppayта gdpdepay), то моя затримка відео стає значно гіршою (і, здається, накопичується, затримка збільшується з часом, і через кілька хвилин відео припиняється)! Чому це могло бути? Я хотів би отримати затримку, яку я отримав оригінальною командою, але також маю особливість мати можливість приєднатися до потоку в будь-який час.

  6. Я читав, що RTSP + RTP зазвичай використовують комбінацію TCP та UDP: TCP для керуючих повідомлень та інших речей, які не повинні втрачатися, та UDP для фактичної передачі відеоданих. У налаштуваннях, наведених вище, я фактично це використовую, чи я просто використовую лише UDP? Для мене трохи непрозоро, чи дбає про це gstreamer чи ні.

Буду вдячний за будь-яку відповідь навіть на одне з цих питань!


Ідея про те, що використання труби |створює будь-яку проблему в цьому контексті, - це неймовірний фрагмент BS. Ви пробували будь-які raspivid | cvlcметоди? У мене не було камери дуже довго або багато часу, щоб грати з нею, але використання її для створення http-потоку (видно на Linux на іншому кінці w / vlc), здається, працює нормально.
золотинки

@goldilocks Я не кажу, що труба - це "проблема", просто, що вона не потрібна і має деякі накладні витрати, як і cat file | grep ...замість цього grep ... file. Труба додає ще один шар копіювання до ядра та з нього, що легко виміряти, особливо на пристроях із низькою пропускною здатністю пам'яті. Якщо gstreamer може читати з файлу пристрою прямо, чому б не використати це? Щодо вашої raspivid | cvlcпропозиції: я використовував це перед тим, як перейти на рішення на базі gstreamer, воно має до 3 секунд більше затримки, ніж gstreamer (не знаю чому).
nh2

Так, це, безумовно, певна затримка. WRT the pipe, мій погляд на "контекст" полягає в тому, що це, можливо, не може бути вузьким місцем тут - мережевий введення / вивід буде на порядок повільніше і т. Д. Ви праві, хоча це може трохи додати процесору. час. Просто я став би не дуже багато; запускаючи це при повній роздільній здатності, cvlcвикористовує ~ 45%, але просто пробіг по трубі при такій швидкості передачі даних (маючи на увазі, труба не сповільнює її ) ледве перемістить голку, я думаю. Як <5% Це не зовсім незначно, якщо ви хочете зробити це якомога ефективніше, звичайно ...
goldilocks

... Я просто не хочу, щоб хто-небудь ще читав це, щоб створити враження, що використання труби тут може бути відповідальним за проблеми затримки або інші проблеми. Це червона оселедець. Або я можу помилятися;)
goldilocks

Якщо вам потрібна ефективність, можливо, ви захочете включити спостережуване загальне використання процесора для різних методів із конкретною роздільною здатністю / частотою кадрів. Єдине, що я спробував, це той, raspivid | cvlcі це 40-50%. Люди можуть краще відповісти на питання, яке кидає виклик їм покращити конкретні показники. Зараз ви багато запитуєте, чому, не пояснюючи, чому кожен важливий.
золотинки

Відповіді:


8

Варіанти:

  1. raspivid -t 0 -o - | nc -k -l 1234

  2. raspivid -t 0 -o - | cvlc stream:///dev/stdin --sout "#rtp{sdp=rtsp://:1234/}" :demux=h264

  3. cvlc v4l2:///dev/video0 --v4l2-chroma h264 --sout '#rtp{sdp=rtsp://:8554/}'

  4. raspivid -t 0 -o - | gst-launch-1.0 fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=SERVER_IP port=1234

  5. gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=SERVER_IP port=1234

  6. uv4l --driver raspicam

  7. picam --alsadev hw:1,0

Що слід врахувати

  • затримка [мс] (з і без прохання клієнта отримати більше кадрів в секунду, ніж сервер)
  • Холостий процесор [%] (вимірюється top -d 10)
  • Клієнт CPU 1 [%]
  • ОЗУ [МБ] (ВДЕ)
  • ті ж налаштування кодування
  • однакові особливості
    • аудіо
    • знову підключитись
    • Незалежний клієнт ОС (vlc, webrtc тощо)

Порівняння:

            1    2    3    4    5    6    7
latency     2000 5000 ?    ?    ?    ?    1300
CPU         ?    1.4  ?    ?    ?    ?    ?
CPU 1       ?    1.8  ?    ?    ?    ?    ?
RAM         ?    14   ?    ?    ?    ?    ?
encoding    ?    ?    ?    ?    ?    ?    ?
audio       n    ?    ?    ?    ?    y    ?
reconnect   y    y    ?    ?    ?    y    ?
any OS      n    y    ?    ?    ?    y    ?
latency fps ?    ?    ?    ?    ?    ?    ?

1
Чому всі значення в цій таблиці " ?"?
larsks

@larsks тому, що ніхто не піклується про тестування та заповнення даних про цю "вікі спільноти"
користувач1133275

6

Тільки сучасний спосіб потоку H264 в браузер з UV4L : немає затримки, ні конфігурації, з додатковим аудіо, опціонально двостороння аудіо / відео. Немає чарівного соусу GStreamer, проте можливо розширити його використання.


Оскільки я хочу передати на свій сервер і потенційно смартфони, потокове перегляд у браузер не є обов'язковою умовою. Крім того, браузер може накласти додаткові обмеження на нього (наприклад, відсутність RTSP, потенційно не TCP, якщо ви не використовуєте WebRTC, але це ненавмисно). Але UV4L все ще виглядає перспективно. Чи можете ви зв’язатись із місцем, де я можу прочитати про те, як його використовувати / витягувати з нього дані для потокового передавання по мережі?
nh2

Свята корова, я думаю, я знайшов сторінку прикладу ... ця штука, здається, здатна зробити все ! RTMP, RTSP, потокова передача HTTPS, WebRTC, "Виявлення об'єктів у режимі реального часу та відстеження об'єктів + ​​Виявлення обличчя" - що за чорт ?? Кожен з якимись простими прапорами командного рядка uv4l? Мій трубопровід gstreamer зараз виглядає досить застарілим! Не можете чекати, щоб перевірити, як затримка!
nh2

1
О ні, це закрите джерело :( Це дискваліфікує це для домашнього спостереження, я мав на увазі :(
nh2

він підтримує WebRTC, двосторонній WebRTC. затримка становить ~
200 мс

@ nh2, посилання, здається, порушено, чи є у вас оновлене місце на цій прикладі?
Карайте Соні

1

1.) h264es, що протікає по мережі (лише зразок)

на сервері:

raspivid -v -a 524 -a 4 -a "rpi-0 %Y-%m-%d %X" -fps 15 -n -md 2 -ih -t 0 -l -o tcp://0.0.0.0:5001

на клієнта:

mplayer -nostop-xscreensaver -nolirc -fps 15 -vo xv -vf rotate=2,screenshot -xy 1200 -demuxer h264es ffmpeg://tcp://<rpi-ip-address>:5001

2.) Потокова передача mjpeg по мережі (лише зразок)

на сервері:

/usr/local/bin/mjpg_streamer -o output_http.so -w ./www -i input_raspicam.so -x 1920 -y 1440 -fps 3

на клієнта:

mplayer -nostop-xscreensaver -nolirc -fps 15 -vo xv -vf rotate=2,screenshot -xy 1200 -demuxer lavf http://<rpi-ip-address>:8080/?action=stream

все це працює навіть на RPi Zero W (налаштовано як сервер)


Гей, дякую за вашу відповідь, що це sample onlyозначає?
nh2

Я хотів сказати "це лише приклад". Ви можете адаптувати це до своїх потреб.
sparkie
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.