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
Дякую за коментар і зауваження.
Недавні записи
- Розпізнавання мови (Speech recognition)
- Selenium
- Комп'ютерний зір (Computer Vision)
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
- Модуль драйверів напівмосту IGBT транзисторів
- Драйвер IGBT транзисторів на A316J
- AS5600. Варіант встановлення на BLDC мотор
- DC-DC для IGBT драйверів ізольований 2 W +15 -8 вольт
- U-FOC - Векторне керування безколекторними моторами
Tags
esp8266 examples adc usart rfid eb-500 soldering lcd stm32 raspberry-pi python mongodb gps mpu-9250 sensors led hih-4000 foc ngnix wifi servo sms ethernet bldc 3d-printer bluetooth mpx4115a web pmsm options remap solar timer bme280 mpu-6050 avr docker flash bkp capture gpio uart meteo i2c usb rtc encoder programmator ssd1306 battery displays java-script barometer watchdog eeprom flask websocket pwm dht11 motor ssd1331 piezo smd brushless atmega books css git st-link dc-dc html nodemcu dma nvic rs-232 exti tim bmp280 max1674
Архіви