Відео.
Спробував підключити свою web-камеру Logitech HD Webcam C270 до малинки raspberry pi. Виявляється все дуже просто. Відеопотік береться з вашої камери і стрімітся у мережу у mjpeg форматі. І більшість рішень для стрімінга відео базується на проекті MJPG-streamer.
Існує готове рішення на базі MJPG пакету від хлопця з Румунії, яке має назву PiEye і дозволяє “з коробки” запустити роботу USB-відеокамери. В Інтернеті є багато прикладів, ось деякі із них:
- PiEye – webcam streaming in M-JPG format with Raspberry Pi
- Видеотрансляция с помощью веб-камеры на Raspberry PI
- How to build and run MJPG-Streamer on the Raspberry Pi
Збережу для себе послідовність установки:
- Ставимо пакет libv4l-0:
sudo apt-get install
libv4l-0
- Завантажуємо пакет mjpg-streamer-rpi: wget http://www.bobtech.ro/get?download=36:mjpg-streamer-rpi
- Змінюємо довгу назву пакета на коротшу: mv get\?download\=36\:mjpg-streamer-rpi mjpg-streamer-rpi.tar.gz
- Розпакуємо: tar -zxvf mjpg-streamer-rpi.tar.gz
- Запускаємо роботу відео: ./mjpg-streamer.sh start
В ідеалі, якщо все піде гладко, то своє селфі-відео ви побачите за адресою: http://raspberrypi:8080?action=stream
Ви також можете додати відео до вашої web-сторінки за допомогою тега img: <img src="
http://raspberrypi:8080?action=stream
"/>
Аудіо.
Трохи погрався із відео і згадав що моя logitech C270 має вбудований мікрофон, до речі непоганої якості. І подумав, а чому б не прикрутити і аудіо супровід? З цього місця починаються проблеми.
Виявляється науково-технічний прогрес зробив великий крок у передачі відео і чомусь зовсім обділив аудіо. Якщо ідеться мова про просту передачу відео/аудіо потоку між “серверами” то із цим проблем начебто не виникає. Я ж захотів (як думаю так зробив би будь-який пересічний користувач) слухати звук безпосередньо у вікні свого улюбленого браузера, паралельно із відео-картинкою. Дивно, але начебто більш ресурсо-вибагливий відео-потік браузер через тег img без проблем і лагів виводить, а от звук іде із затримкою або вимагає встановлення стороннього плагіна! Але про це далі.
Дізнаємось номер пристрою у ваші системі, якій може записувати дані з мікрофону:
> sudo arecord -l
**** List of CAPTURE Hardware Devices **** card 1: U0x46d0x825 [USB Device 0x46d:0x825], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 |
У моєму випадку це: hw:1,0 (або plughw:1) Варто відразу просто перевірити запис звуку у WAV файл командою:
> sudo arecord -D plughw:1 –duration=15 -f cd -v test.wav – якщо все добре, то ідемо далі.
RTSP
Спочатку я спробував передати аудіо через RTSP протокол, який фактично розроблений для передачі мультимедіа даних в реальному часі. Я пробував aconv, ffmpeg, vlc, але безуспішно – пакети видавали помилки або просто не хотіли працювати із ALSA на малині . Згодом я знайшов чудовий проект LIVE555 Streaming Media набір модулів для стрімінга по RTSP написаного на С++. Завантажуємо і компілюємо його згідно інструкції на сайті.
Далі ви можете змінювати код і налаштовувати модулі на ваш розсуд. Приведу приклади для стрімініга WAV та MP3 аудіо потоків з stdin-а . Дані приклади можна скомпілити в папці /testProgs за допомогою команди make
Для стрімінга WAV (testWAVstreamer):
Для стрімінга MP3 (testMP3streamer):
Ось приклади роботи програм:
Швидкодія | Команда | Трафік |
(~realtime) | sudo arecord -D plughw:1 -f S16_LE -r 4000 -c1 | ./testWAVstreamer | (~75 kbit/sec) |
(~realtime) | sudo arecord -D plughw:1 -f S16_LE -r 8000 -c1 | ./testWAVstreamer | (~150 kbit/sec) |
(2.4 sec) | sudo arecord -D plughw:1 -f cd -c1 | lame -b32 – | ./testMP3streamer | (~45 kbit/sec) |
(1.2 sec) | sudo arecord -D plughw:1 -f cd -c1 | lame – | ./testMP3streamer | (~75 kbit/sec |
(0.6 sec) | sudo arecord -D plughw:1 -f cd | lame – | ./testMP3streamer | (~150 kbit/sec) |
Для прикладу взято порт сервера 2222. І якщо відкрити на клієнті VLC адресу: rtsp://192.168.0.133:2222/testStream то почуємо себе 🙂
Але! з rtsp в браузері виникла проблема. HTML5 сумісні браузери начебто мають грати rtsp потік, просто у тезі <audio> але вони цього не роблять! Халепа. Дану проблему можливо вирішити шляхом використання сторонніх плеєрів-плагінів (RealPlayr, QuickTime,VLC), отак наприклад:
<embed type=”application/x-vlc-plugin” pluginspage=”http://www.videolan.org” width=”160″ height=”100″ id=”vlc” autoplay=”true” allowfullscreen=”false” windowless=”flase” mute=”false” loop=”true” toolbar=”true” bgcolor=”#111111″ text=”Hello Seka!” branding=”false” controls=”true” target=”rtsp://192.168.0.133:2222/testStream”> </embed> |
Але плагіни часто-густо відлякують користувачів і реалтайм пропадає, бо плеєр додає свою затримку.
ICECAST+ICES
Потім я спробував використати готове рішення – Icecast 2. Сервер для потокового аудіо мовлення. Наприклад для Інтернет-радіо.
Зв’язка DarkIce and Icecast2 загалом працювала, але з нез’ясованих причин постійна збільшувалась затримка потоку і потрібні були танці з бубном для установки .
В решті-решт у мене непогано запрацювала зв’язка Ices + Icecast2 – модуль ніби “рідний”. Налаштування першого та другого додаю:
Налаштування для Icecast2 (> sudo nano /etc/icecast2/icecast.xml):
Налаштування для Ices (> sudo nano /etc/ices2/ices.xml):
Запускаємо Icecast сервер:
> sudo service icecast2 restart
І під’єднуємо аудіопотік:
> sudo ices2 /etc/ices2/ices.xml
Начебто працює! Звук, звичайно, іде із затримкою 5-10 сек, мабуть це десь icecast плужить. Але в браузері все грає гладко і не треба ніяких плагінів, а лише тег <audio>:
<audio preload=”none” autoplay=”autoplay”><source src=”http://192.168.0.133:8000/audio.ogg” type=”audio/ogg”> <source src=”http://192.168.0.133:8000/audio.ogg” type=”audio/mpeg”> Your browser does not support the audio element. </audio> |
Для онлайн-радіо піде аж бігом, а от для реал-тайма недотягує. В ідеалі хотілось би синхронізоване відео і аудіо близьке до ріал-тайма, тобто є ще над чим ще подумати. Думаю розв’язок існує.
З Новим Роком малята!