Raspberry Pi. Live-stream video


10.12.2018

Знадобилося мені пострімити з Raspberry Pi. З динамічного IP, або сірого IP, коли "прокинути" порт через роутер не вийде і доводится робити стрім через зовнішній сервер. Спробував YouTube, спробував свій сервер на Nginx з модулем nginx-rtmp-module який підняв на VPS. Спробував GStreamer. Що з цього вийшло читайте далі.

Live stream Raspberry Pi

Стрім на YouTube з Raspberry Pi

Спочатку вирішив спробувати YouTube як самий простий варіант. (Стаття з якої все почалося: https://www.makeuseof.com/tag/live-stream-youtube-raspberry-pi/) Отже нам потрібно: Спочатку налаштуємо камеру Raspberry Pi, якщо вона ще не була налаштована. Запускаємо:

sudo raspi-config
У розділі Interfacing Options вмикаємо камеру.

Як вімкнути камеру на Raspberry Pi Налаштування камери на Raspberry Pi Модуль камери Raspberry Pi

Перезавантажуємо Raspberry Pi:


sudo reboot
Перевіряємо роботу камери:

raspistill -o image.jpg
Про камеру для Raspberry я писав раніше. Кому цікаво можна почитати тут: Raspberry Pi Camera Щоб стрімити нам знадобиться avconv, утиліта входить до складу libav-tools. avconv буде конвертувати відео потік у потрібний формат. Встановлюємо libav-tools:

sudo apt-get install libav-tools
Тепер налаштуємо on-line трансляцію на екаунті YouTube: Попередження: YouTube постійно змінює свій інтерфейс, тому наведені нижче екрани можуть відрізнятися від того, що побачите Ви. Для експериментів зі стрімом я завів окремий екаунт на YouTube і коли я спробував налаштувати on-line трансляцію, YouTube сказав що я гарний хлопчик, але маю зачекати добу поки вони там щось собі перевірять. І тільки після цього я зможу стрімити. OK. Чекаємо добу. Мушу сказати, що YouTube (як і увесь Google) постійно щось змінює у своїх правилах, це особисто мене бісить, тому буде і альтернативний варіант. Отже коли Ви будите налаштовувати свій екаунт може так статися що чекати доведеться інший час.

Створення стріму на Youtube

Гаразд, пройшла доба, налаштовуємо on-line трансляцію.

Параметри Live стріму на Youtube

Для подальшої роботи Вам потрібно знати/записати наступні налаштуваня on-line трансляції:

  • URL для трансляції. Наприклад rtmp://a.rtmp.youtube.com/live2/
  • таємний ключ трансляції. Виглядає він приблизно так: pccw-w7u4-vpth-a8va
  • URL для перегляду відео. Щось типу https://gaming.youtube.com/channel/UCje75iEr1O_0XLKAZpl2wvQ/live
Після налаштування YouTube готовий приймати відео потік, та віддавати його глядачам. Тепер повернемося до Raspberry Pi з камерою. Запускаємо сртім такою командою:

raspivid -o - -t 0 -vf -hf -fps 30 -b 6000000 | avconv -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -f h264 -i - -vcodec copy -acodec aac -ab 128k -g 50 -strict experimental -f flv rtmp://x.rtmp.youtube.com/live2/[your-secret-key-here]
Де: rtmp://x.rtmp.youtube.com/live2/ - URL для трансляції
your-secret-key-here - той самий таємний ключ трансляції (виглядає він приблизно так: pccw-w7u4-vpth-a8va) Коли трасляція запустится у консолі Raspberry Pi побачемо щось схоже на таке:

Запуск Live стріму на Youtube з Raspberry Pi

Відкриваємо браузер (https://gaming.youtube.com/channel/UCje75iEr1O_0XLKAZpl2wvQ/live) та дивимось стрім... В моєму випадку затримка відео сягала 10-15 секунд. Це капець як довго! Спробував зарізати якість відео до мінімуму, але помітного зменшення затримки це не дало. А коли під час паузи у трансляції YouTube почав ще й рекламу крутити, тоді я зрозумів, що треба швидше шукати альтернативу.

Nginx з модулем nginx-rtmp-module. Стрім з Raspberry Pi

Існує програмне забезпечення, яке дозволяє вирішити задачу трансляції відео і не використовувати сторонні сервіси такі як YouTube. Для цього потрібно мати сервер з реальнім IP у інтернеті. Достатньо орендувати VPS - це віртуальний сервер, і налаштувати на ньому необхідне програмне забезпечення (rtmp - сервер). Якщо глядачів буде не багато, для стріму підійде люба сама дешева VPS. В моєму випадку глядач буде один - Я, тому ресурсів самої дешевої VPS вистачить з головою. Я встановлю Nginx з модулем nginx-rtmp-module, який підіймає свій сервер для стріму. Далі команди для встановлення Nginx з модулем nginx-rtmp-module:

sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
wget http://nginx.org/download/nginx-1.15.1.tar.gz
wget https://github.com/sergey-dryabzhinsky/nginx-rtmp-module/archive/dev.zip
tar -zxvf nginx-1.15.1.tar.gz
unzip dev.zip
cd nginx-1.15.1
./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-dev
make
sudo make install
Перший старт:

sudo /usr/local/nginx/sbin/nginx
В кінец файлу /usr/local/nginx/conf/nginx.conf додаємо:

rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                application live {
                        live on;
                        record off;
                }
        }
}
Перезапускаємо nginx:

sudo /usr/local/nginx/sbin/nginx -s stop
sudo /usr/local/nginx/sbin/nginx
Наш власний rtmp-сервер для стріму готовій приймати потокове відео. Попередження: Сервер буде приймати відео потік від будь-кого. Під час тестів я так все і залишив. На робочому сервері слід прикрутити хоч яку не-будь аутентифікацію. Тут розглядається простий варіант аутентифікації для Nginx з модулем nginx-rtmp-module: https://smartshitter.com/musings/2017/12/nginx-rtmp-streaming-with-simple-authentication/ Тепер на Raspberry Pi запускаємо команду схожу, на ту, якою запускали стрім на YouTube, тільки заміняємо посилання на свій rtmp-сервер:

raspivid -o - -t 0 -vf -hf -fps 30 -b 6000000 | avconv -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -f h264 -i - -vcodec copy -acodec aac -ab 128k -g 50 -strict experimental -f flv rtmp://192.168.0.105/live/test
Чим переглядати? В нас не буде web - інтерфейсу, тому для перегляду потокового відео треба використовувати відео-програвач, який вміє грати потокове відео, наприклад VLC media player. Запускаємо VLC media player, в меню вибираємо Медіа -> Відкрити URL...", вказуємо rtmp://192.168.0.105/live/test і переглядаємо відео.

Перегляд стріму з Raspberry Pi Перегляд стріму. Сервер

На жаль я не зміг позбутися затримки. На власному сервері затримка помітно менша ніж при використанні YouTube, але все ж таки залишається у межах 5 секунд. Скоріш за все ця затримка виникає через те, що конвертація відео вимагає певного часу, і Raspberry Pi з цією задачею справляється не надто швидко. Вирішив підняти Nginx з модулем nginx-rtmp-module у локальній мережі і переконався у тому, що затримки саме на Raspberry Pi.

Стрім без затримок. Raspberry Pi + модуль камери

Для реалізації передачі потокового відео з мінімальними затримками існують декілька рішень. Я зупинився на GStreamer. Передача виконується без використання сторонніх утіліт для перетворень відео, що скорочує затримку до мінімуму. На жаль GStreamer буде працювати тільки у локальній мережі, та нічого страшного, завжди можна налаштувати тунель або VPN. GStreamer треба встановити на комп`ютер - передавач і комп`ютер - приймач. Команда для встановлення GStreamer на Raspberry Pi:

apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools
Команда для встановлення GStreamer на Ubuntu така сама:

apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools
Подробиці про те, як встановилт GStreamer інші операційні системи читайте тут: https://gstreamer.freedesktop.org/documentation/installing/on-linux.html Після встановлення GStreamer на Raspberry запускаємо трансляцію:

raspivid -n -w 640 -h 480 -t 0 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=10 pt=96 ! udpsink host=192.168.0.105 port=9000
192.168.0.105 - IP адреса хоста, що буде приймати відео. Тобто, ми вказуємо куди стріляти. На комп`ютері (192.168.0.105), що буде приймати відео запускаємо команду:

gst-launch-1.0 -v udpsrc port=9000 caps=`application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264` ! rtph264depay ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! avdec_h264 ! videoconvert ! autovideosink sync=false
Після чого має відкритися вікно з відео. Затримка манша за 0.5 сек. Якщо поставити більші розміри відео, затримка може збільшитися. При розмірі відео 640x480 вдалося досягти мінімальної затримки з досить нормальною якістю відео.

VPN

Про те, як налаштувати VPN або тунель мені писати влом. Гугліть. Питання налаштування VPN досить об`ємне і виходить за межі цієї статті. Тому детальну інформацію можна знайти на спеціалізованих сайтах присвячених адмініструванню Linux систем.

Висновки

GStreamer показав хороші результати швидкості передачі відео та відмінну якість відео. У випадках з YouTube та Nginx з модулем nginx-rtmp-module використовувалась конвертація відео що спричиняло спотворення відео від елементарних "кубиків" до майже білого екрану з ледь помітними силуетами. У випадку з GStreamer таких явищ не було. GStreamer передає відео без використання сторонніх конверторів тому і якість і трафік більший. GStreamer також потребує встановлення специфічного програмного забезпечення у той час коли для перегляду YouTube достатньо тільки браузера. У випадку з nginx-rtmp потрібно лише стандартный плеер. Сподіваюсь Ви зможете обрати спосіб який Вам підходить більш за все або знайти свій.

Для стріму з Raspberry я використовував

  • Raspberry Pi 3 Model B (with Raspbian OS)
  • Raspberry Pi Camera Module
  • VPS - (у хостер провайдера Deltahost з ОС Ubuntu (тут не треба платити за трафік чи використані ресурси - ціна фіксована, що підходить для ретрансляції відео)
  • Локальний комп під ОС Ubuntu
Бажаю успіхів. Дивись також:

Raspberry Pi
Коментарі:

Додати коментар

* - обов'язкові поля

Архіви

Підписка