Raspberry Pi. Live-stream video
Знадобилося мені пострімити з Raspberry Pi. З динамічного IP, або сірого IP, коли "прокинути" порт через роутер не вийде і доводится робити стрім через зовнішній сервер. Спробував YouTube, спробував свій сервер на Nginx з модулем nginx-rtmp-module який підняв на VPS. Спробував GStreamer. Що з цього вийшло читайте далі.
Стрім на YouTube з Raspberry Pi
Спочатку вирішив спробувати YouTube як самий простий варіант. (Стаття з якої все почалося: https://www.makeuseof.com/tag/live-stream-youtube-raspberry-pi/) Отже нам потрібно:- Raspberry Pi
- USB або рідна камера (модуль камери) Raspberry Pi. Я використовував модуль камери для Raspberry
- Екаунт на YouTube
sudo raspi-config
У розділі Interfacing Options вмикаємо камеру.
Перезавантажуємо 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) постійно щось змінює у своїх правилах, це особисто мене бісить, тому буде і альтернативний варіант. Отже коли Ви будите налаштовувати свій екаунт може так статися що чекати доведеться інший час.
Гаразд, пройшла доба, налаштовуємо on-line трансляцію.
Для подальшої роботи Вам потрібно знати/записати наступні налаштуваня on-line трансляції:
- URL для трансляції. Наприклад rtmp://a.rtmp.youtube.com/live2/
- таємний ключ трансляції. Виглядає він приблизно так: pccw-w7u4-vpth-a8va
- URL для перегляду відео. Щось типу https://gaming.youtube.com/channel/UCje75iEr1O_0XLKAZpl2wvQ/live
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 побачемо щось схоже на таке:
Відкриваємо браузер (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
і переглядаємо відео.
На жаль я не зміг позбутися затримки. На власному сервері затримка помітно менша ніж при використанні 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
Висновки
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 — що це таке?
- Raspberry Pi — GPIO
- Raspberry Pi — UART
- Raspberry Pi — FT232
- Raspberry Pi — PWM і Сервопривод
- Raspberry Pi — DHT11
- Raspberry Pi - FM Transmitter
- Прошивка AVR мікроконтролерів за допомогою Raspberry Pi
- Raspberry Pi — LCD display 1602
- Raspberry Pi — WiFi
- Raspberry-Pi — I2C (TWI)
- Raspberry Pi - DS18B20
- Raspberry Pi Camera
- nRF24L01+ ATMEGA + Raspberry Pi
- BMP180 + Raspberry Pi + WH1602
- Wi-Fi Метео станція
- Raspbian. Apache + PHP + Python + MySQL
- Встановлюємо Raspbian на Raspberry Pi без клавіатури та монітору
- IR-дистанційне керування. Використання LIRC у Python
- Raspberry Pi. Raspbian. Відправлення пошти через аккаунт Gmail
- Neoway M590 – GSM/GPRS modem
- MPU-6050 – гіроскоп – акселерометр
- HMC5883L Магнітометр
- PWM контролер з інтерфейсом I2С на базі мікросхеми PCA9685
- Метеостанція на Raspberry Pi своїми руками
- Raspberry Pi. Live-stream video
Невалідна команда для Ubuntu актуальна тут https://gstreamer.freedesktop.org/documentation/installing/on-linux.html?gi-language=c apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
Дякую за коментар і зауваження.
Tags
bme280 bmp280 gps mpu-6050 options stm32 ssd1331 ssd1306 eb-500 3d-printer soldering tim mpu-9250 dma watchdog piezo exti web raspberry-pi docker ngnix solar bluetooth foc html css brushless flask dc-dc capture gpio avr rs-232 mpx4115a atmega mongodb st-link barometer pwm nvic git java-script programmator dht11 hih-4000 pmsm encoder max1674 smd sensors rtc adc lcd motor timer meteo examples i2c usb flash sms rfid python esp8266 servo books bldc remap eeprom bkp battery ethernet uart usart displays led websocket nodemcu wifi
Архіви





