Для дистанційного управлінням роботами з бортовою камерою, для «розумного будинку» та інших систем Інтернету речей необхідно формувати відеопотік в реальному масштабі часу. Даний урок присвяченй різним способам отримання такого відеопотоку з Raspberry Pi та PiCamera.
Методи отримання потокового відео
Є два способи, які працюють майже без затримки: gstreamer і netcat. VLC є альтернативним методом, але важко отримати безінерційний відеопотік.
Gstreamer (для Mac)
Це рішення досить стабільне, без затримок і гнучке. Причини цього в тому, що gstreamer має чудові прив'язки до Python і порядок, в якому першим стартує відправник або приймач не має значення. Установка gstreamer дуже прооста, як на RPi, так і на Mac. Припускаємо, що ви вже встановили і дозволили PiCamera. Тепер на своєму RPi просто виконайте:
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install gstreamer1.0
На Mac найпростіший спосіб встановити gstreamer - скористатися homebrew. Просто виконайте:
$ brew install gstreamer gst-plugins-base gst-plugins-good
На Windows автор не зміг отримати gstreamer, який би працював, хоча його можна завантажити звідси.
Тепер прийшов час для потокової передачі. Вам потрібні виконати такі команди на RPi (змініть лише IP-адресу на адресу свого цільового комп'ютера):
$ raspivid -t 999999 -b 2000000 -o - | gst-launch-1.0 -e -vvv fdsrc ! h264parse ! rtph264pay pt=96 config-interval=5 ! udpsink host=192.168.18.60 port=5000
На своєму Mac зробіть:
$ gst-launch-1.0 udpsrc port=5001 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false
Автор отримав через Wi-Fi близький до реального в часі відеопотік. Затримка була меншою 300 мс і це на В+. Було б корисно все ж таки спробувати запустити gstreamer і на Windows.
Для перегляду на Android рекомендується встановити RaspberryPi Camera Viewer.
Додаток з самого початку призначений для перегляду потоку камери від апаратних RPi-камер. Для побудови відеопотоку gstreamer був обраний як кращий мультимедійний фреймворк з відкритим вихідним кодом. Кількість бажаних функцій і опцій конфігурації з часом зросла, тому додаток перетворився в gstreamer viewer. У поточній версії ви зможете побудувати будь-який pipeline (у форматі gstreamer) і переглядати його на будь-якому Android пристрої.
Для перегляду відеопотоку від свого RPi, будь ласка, дотримуйтесь пунктів нижче:
1. Підключіть камеру до RPi
2. Запустіть в термінальному режимі команду:
raspivid -n -t 0 -h 200 -w 320 -fps 25 -hf -b 2000000 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=192.168.18.80 port=5000
де хост 192.168.18.80 треба замінити IP-адресою вашого RPi.
Netcat/mplayer
Альтернативою gstreamer є використання хакерського «швейцарського ножа» netcat для виведення даних з камери через мережеві труби. Це вимагає установки mplayer на Mac і на PC. Знову ж, це легко зробити для Mac з brew. Хитрість полягає в тому, щоб читати на більш високій частоті кадрів, ніж відправляє RPi. Таким чином, буфер залишається порожнім і ми маємо відео в режимі реального часу.
Але порядок, в якому виконувати команди, важливий. Спочатку зробіть це на Mac:
$ nc -l 5001 | mplayer -fps 31 -cache 1024 -
Потім зробіть це на RPi - вставивши правильну IP-адресу, звичайно:
$ raspivid -t 999999 -w 640 -h 480 -fps 20 -o - | nc 192.168.18.60 5001
Також можна зробити це і на Windows. Для цього завантажте на ПК netcat і mplayer та розмістіть їх в одній і тій же директорії. Перейдіть в цю директорію за допомогою командного рядка і виконайте:
> nc -l -p 5001 | mplayer -cache 32 -demuxer lavf -
VLC
Потокове відео через VLC з RPi отримати досить просто. Не завжди це можна зробити безінерційно, але чудово те, що ви можете підібрати потік на iPad зі встановленого VLC, або на Mac, використовуючи тільки додаток VLC. Немає необхідності для вкористання brew.
Спочатку встановіть VLC на RPi:
$ sudo apt-get install vlc
Потім почніть відтворення на RPi:
$ raspivid -o - -t 0 -hf -b 1000000 -w 640 -h 480 -fps 24 |cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8160}' :demux=h264
Щоб підібрати потік, відкрийте програму VLC Player на своєму ПК, перейдіть в мею File, Open Network або Open Network Stream (залежить від того mac чи pc версія) і заберіть потік з URL, за допомогою: http://192.168.18.80:8160. Не забудьте лише вставити ім'я або IP-адресу свого RPi.
Ще один, чи не найпростіший спосіб для перегляду камери RPi на пристрої Android – скористатися додатком RaspiCam Remote:
Ніякого програмного забезпечення не треба встановлювати або налаштовувати на RPi для базового використання. Фотографії з камери RPi можуть бути збережені в галереї вашого телефону. Потокове відео 30 кадрів в секунду формату h264 доступне в режимі моніторингу камери на вашому Android пристрої (вимагає VLC - sudo apt-get install vlc)
MJPG-streamer
Багато з IP веб-камери використовують старий потоковий протокол під назвою Motion JPEG або скорочено MJPEG.
Що таке Motion JPEG? Це просто потік окремих JPEG фотографій, одна за одною. Як не дивно, але більшість сучасних браузерів можуть програвати MJPEG потоки.
Зворотною стороною MJPEG потоків є те, що вони не такі ефективні, як H.264, який значно підвищує якість і зменшує розмір шляхом кодування тільки відмінності одного кадру від іншого. З MJPEG кожен кадр кодується для всього зображення JPEG. Інколи це не має значення.
Детальніше про використаня MJPG для передачі потоковго відео в статті Переглядаємо відеопотік з камери Raspberry Pi через веб-браузер.
Ffmpeg на Jessie
Ffmpeg - це комплекс безкоштовних комп'ютерних програм та програмних бібліотек для маніпуляцій з цифровими відео- та аудіо-матеріалами - запис, конвертація та пакування у різні формати контейнерів. Ffmpeg славиться наявністю різних аудіо та відео кодеків, що дозволяє вибрати оптимальний формат для організації відеопотоку та розміщення відео на сайті. Інтерфейс командного рядка має інтуїтивний вигляд Хоча ffmpeg було розроблено під Linux, але він успішно працює й у Apple Mac OS X та Microsoft Windows.
Деякі ключі ffmpeg
-i — вхідний файл
-ar — частота дескритизації звуку в Гц
-ab — бітрейт звуку кБіт/c
-f — формат вихідного файла
-s — розмір вихідного файлу в пікселях
Приклади застосування
>ffmpeg -i вхідний_відео_файл.mp4 вихідний_відео_файл.avi
>ffmpeg -i вхідний_аудіо_файл.mp3 вихідний__аудіо_файл.wav
Наступні інструкції пояснюють, як встановити Ffmpeg з джерела коду (і тому вони вимагають такого компілятора як gcc). Будь ласка, занотуйте:
• Ffmpeg буде встановлений в /usr/local/bin
• Дані інструкції спеціально для Jessie (Linux 8.0 версії). Використовуйте ці інструкції, якщо встановлений дистрибутив Wheezy.
1. Налаштування APT для використання мультимедійного репозиторію Debian
Примітка: команди з цього розділу повинні бути запущені від користувача root.
1.1) Додайте наступне в нижній частині файлу /etc/apt/sources.list:
deb http://www.deb-multimedia.org jessie main non-free
deb-src http://www.deb-multimedia.org jessie main non-free
1.2) Оновіть базу даних APT-пакетів, ввівши:
apt-get update
1.3) Дозвольте apt довіряти ключам мультимедіа Debian, набравши:
apt-get install deb-multimedia-keyring
1.4) Знову оновіть базу даних APT-пакетів, ввівши:
apt-get update
2. Видалення пакетів ffmpeg Debian
Примітка: команди з цього розділу повинні бути запущені від користувача root.
Видаліть пакет ffmpeg, якщо він встановлений, щоб уникнути плутанини, викликаної наявністю двох версій встановлених ffmpeg і потенційних конфліктів з пакетами, які будуть встановлені на наступному етапі:
apt-get remove ffmpeg
3. Встановлення бібліотек
Примітка: команди з цього розділу повинні бути запущені від користувача root.
Встановіть пакети бібліотек і засоби побудови:
apt-get install build-essential libmp3lame-dev libvorbis-dev libtheora-dev libspeex-dev yasm pkg-config libfaac-dev libopenjpeg-dev libx264-dev
4. Встановлення Ffmpeg
Примітка: Рекомендуємо команди з цього розділу виконувати як позакореневий користувач (хоча вони все одно повинні працювати, якщо запустити від root)
4.1) Завантажте і розархівуйте вихідний код ffmpeg:
mkdir software
cd software
wget http://ffmpeg.org/releases/ffmpeg-2.7.2.tar.bz2
cd ..
mkdir src
cd src
tar xvjf ../software/ffmpeg-2.7.2.tar.bz2
4.2) Перейдіть у директорію з кодом:
cd ffmpeg-2.7.2
4.3) Налаштуйте, побудуйте і встановіть:
./configure --enable-gpl --enable-postproc --enable-swscale --enable-avfilter --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libx264 --enable-libspeex --enable-shared --enable-pthreads --enable-libopenjpeg --enable-libfaac --enable-nonfree
make
sudo make install
4.4) Запустіть як root
/sbin/ldconfig
4.5) Перезапустіть
sudo reboot
Тепер ви можете скористатися Ustream - одним з найпопулярніших сайтів потокового відео в Інтернеті. Він використовується НАСА для потокової передачі відео з Міжнародної космічної станції на весь світ. Як це зробити, детально описано в статті Передавання потокового відео з Raspberry Pi в Інтернет через Ustream.
Завдання. Реалізувати кожен з розглянутих методів формування потокового відео, змінити параметри відеопотоків, щоб отримати допустиму затримку при передаванні відео. Порівняти методи і зробити висновки,