µStreamer
µStreamer - это маленький и очень быстрый сервер, который позволяет организовать трансляцию видео в формате MJPG с любого устройства V4L2 в сеть. Этот формат нативно поддерживается всеми современными браузерами и большинством приложений для просмотра видео (mplayer, VLC и так далее). µStreamer был разработан в рамках проекта Pi-KVM специально для стриминга с устройств видеозахвата VGA и HDMI с максимально возможным разрешением и FPS, которые только позволяет железо.
Функционально µStreamer очень похож на mjpg-streamer при использовании им плагинов input_uvc.so и output_http.so, однако имеет ряд серьезных отличий. Основные приведены в этой таблице:
| Фича | µStreamer | mjpg-streamer |
|---|---|---|
| Многопоточное кодирование JPEG | ||
| Аппаратное кодирование с помощью OpenMAX IL на Raspberry Pi | ||
| Поведение при физическом отключении устройства от сервера во время работы |
с надписью NO SIGNAL,пока устройство не будет подключено снова |
|
| Поддержка DV-таймингов - возможности изменения параметров разрешения трансляции на лету по сигналу источника (устройства видеозахвата) |
||
| Дебаг-логи без перекомпиляции, логгирование статистики производительности, возможность получения параметров трансляции по HTTP |
||
| Поддерживаемые входные форматы устройств | RGB565, |
RGB565, MJPG |
| Поддержка контролов веб-камер (фокус, движение сервами) и всяких настроек, типа яркости, через HTTP |
||
| Возможность сервить файлы встроенным HTTP-сервером, настройки авторизации |
Сносочки:
-
1Для mjpg-streamer существует мой патч, предотвращающий зависание при отключении устройства и добавляющий поддержку DV-таймингов, однако трансляция при этом все равно прерывается. В данный момент этот патч не принят в апстрим, и я даже не гарантирую его стопроцентную работоспособность. Код mjpg-streamer очень плохо структурирован и чрезвычайно запутан, и я мог что-то упустить. Собственно, это одна из причин, почему µStreamer написан с нуля. -
2Поскольку µStreamer писался в первую очередь для устройств видеозахвата, в нем реализованы только те форматы, которые для них были нужны. MJPG в контексте входных данных означает, что устройство умеет самостоятельно сжимать картинку в JPEG и отдавать ее программе, что позволяет значительно снизить загрузку процессора и избавить его от необходимости кодировать картинку софтом. Этот формат поддерживается большинством веб-камер, но не поддерживается ни одним из встреченных мной устройств видеозахвата; его не умеет ни Auvidea B101, ни EasyCap UTV 007. Нет никаких технических сложностей добавить поддержку аппаратного MJPG источника, но у меня просто пока не дошли до этого руки. -
3... и не будет. µStreamer придерживается концепции UNIX-way, так что если вам нужно нарисовать маленький сайтик со встроенной трансляцией - просто поставьте NGINX.
TL;DR
Если вам нужно вещать стрим с уличной камеры и управлять ее параметрами - возьмите mjpg-streamer. Если же вам нужно очень качественное изображение с высоким FPS - µStreamer ваш бро.
Сборка
Для сборки вам понадобятся make, gcc, libevent с поддержкой pthreads и libjpeg8/libjpeg-turbo.
На Raspberry Pi програма автоматически собирается с поддержкой OpenMAX, если обнаружит нужные хедеры в /opt/vc/include.
$ git clone --depth=1 https://github.com/pi-kvm/ustreamer
$ cd ustreamer
$ make
$ ./ustreamer --help
Для Arch Linux в AUR есть готовый пакет: https://aur.archlinux.org/packages/ustreamer
Использование
Будучи запущенным без аргументов, ustremaer попробует открыть устройство /dev/video0 с разрешением 640x480 и начать трансляцию на http://localhost:8080. Это поведение может быть изменено с помощью опций --device, --host и --port. Пример вещания на всю сеть по 80 порту:
# ./ustreamer --device /dev/video1 --host 0.0.0.0 --port 80
Рекомендованный способ запуска µStreamer для работы с Auvidea B101 на Raspberry Pi:
# ./ustreamer --format=uyvy --encoder=omx --dv-timings
За полным списком опций обращайтесь к встроенной справке: ustreamer --help.
Лицензия
Copyright (C) 2018 by Maxim Devaev mdevaev@gmail.com
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.