сайт для палких паяльників

Знадобилося мені пострімити з 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
– USB або рідна камера (модуль камери) Raspberry Pi. Я використовував модуль камери для Raspberry
– Екаунт на YouTube

Спочатку налаштуємо камеру 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 сек. Якщо поставити більші розміри відео, затримка може збільшитися. При розмірі відео 640×480 вдалося досягти мінімальної затримки з досить нормальною якістю відео.

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

Бажаю успіхів.

Дивись також:

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

 
Translate
Архіви

© 2011-2019 Андрій Корягін, Кременчук - Київ, Україна