LINUX — Жизнь в консоли ЕСТЬ.
Главное меню
Последние статьи
Счетчики
FFServer: Трансляция видео с веб-камеры со звуком через браузер.
ffmpeg — набор свободных библиотек с открытым исходным кодом, которые позволяют записывать, конвертировать и передавать цифровые аудио- и видеозаписи в различных форматах. В состав этого пакета входит ffserver — http потоковый сервер для видео и радиовещания.
Принцип трансляции такой: ffmpeg захватывает поток с камеры и отправляет его ffserver-у, ffserver конвертит его превращая в swf, который можно просмотреть в браузере, введя адрес компьютера, на котором ffserver запущен. Использовалась простая usb-камера logitech c170.
apt-get install ffmpeg
Замечание: Я ставил на ubuntu, если у вас debian то нужно ставить из исходников для поддержки H.264 (один из стандартов сжатия видео), из репозитория debian не прокатит.
Конфиг находится в /etc/ffserver.conf
# Порт, на котором будет работать ffserver
Port 4444
# Адрес, на котором будет работать ffserver.
# Если указать 0.0.0.0 то будут использованы все доступные адреса
BindAddress 0.0.0.0
# Максимальное количество обслуживаемых соединений
MaxHTTPConnections 10
# Максимальное количество клиентов
MaxClients 10
# Максимальная используемая полоса (в килобитах)
MaxBandwidth 5000
# Файл журнала. Формат подобен формату лога apache
CustomLog /var/log/ffserver-access.log
# Описываем источник
# Временный файл для хранения промежуточных данных
File /tmp/webcam.ffm
# Максимальный размер файла с промежуточными данными
FileMaxSize 1M
# Команда запуска ffmpeg для захвата видео с камеры и отправки ffserver-у.
# Адрес для отправки данных (localhost) автоматически будет добавлен в конец этой строки.
# (подробнее см. ниже).
Launch ffmpeg -s 640×480 -f video4linux2 -i /dev/video0 -f alsa -i hw:1
# С каких адресов может обращаться источник. Если закоментировано — с любых.
# ACL allow 127.0.0.1
# Описываем поток. SWF-файл с FLV-потоком внутри.
# Источник потока
Feed webcam.ffm
# Используемый формат
Format swf
# Используемый кодек
VideoCodec flv
# Частота кадров
VideoFrameRate 4
# Размер буфера
# VideoBufferSize 100
# Битрейт
# VideoBitRate 200
# Минимальное и максимальное качество (1-лучшее, 31-худшее)
VideoQMin 1
VideoQMax 8
# Размер видео. Дожно совпадать с размером видео на источнике
VideoSize 640×480
# Время ожидания перед началом отправки данных клиенту (в секундах)
PreRoll 0
# Если не нужно транслировать звук
# NoAudio
# При обращении к индексной странице ffserver будем отображать текущий статус сервера
Format status
Некоторые параметры у меня закоментированы, оставил для возможности поэкспериментировать читающим эту статью.
Теперь подробнее о строке:
Launch ffmpeg -s 640×480 -f video4linux2 -i /dev/video0 -f alsa -i hw:1
-s 640×480 — разрешение камеры
-f video4linux2 — интерфейс захвата видео в линукс. Еще можно попробовать video4linux если не прокатит video4linux2.
-i /dev/video0 — путь к камере
-f alsa интерфейс для захвата аудио
-i hw:1 — микрофон. Номер можно посмотреть командой:
arecord -l
ffserver
ffserver -d
для вывода информации в процессе отладки.
Заходим через браузер, например если с того же компьютера: http://127.0.0.1:4444/ , попадаем на информационную страницу ffserver-а, где есть ссылка на просмотр видео.
Желательно использование мощного процессора, ffserver занимает одно ядро полностью, на intel atom задержка показа видео составляла около 2-ух секунд, на dual core около секунды.
Потоковое видео средствами ffserver & ffmpeg
Для организации трансляции нам потребуется:
Теория
FFmpeg — это набор свободных библиотек с открытым исходным кодом, которые позволяют записывать, конвертировать и передавать цифровое аудио и видео в различных форматах. Он включает libavcodec, библиотеку кодирования и декодирования аудио и видео и libavformat, библиотеку мультиплексирования и демультиплексирования в медиаконтейнер. Название происходит от названия экспертной группы MPEG и «FF», означающего «fast forward».
ffserver идёт в комплекте с ffmpeg и выполняет роль медиа-сервера — получает видеопоток от ffmpeg, который может быть запущен на другой машине, и раздаёт его счастливым пользователям.
Каждый получаемый поток называется Feed’ом (далее будет просто фид). Таких потоков может быть несколько, так же как и отдаваемых (выходных).
FFmpeg у нас будет захватывать видео с веб-камеры или читать из файла.
Практика
- Port 8090
- BindAddress 0.0.0.0
- MaxClients 100
- MaxBandwidth 20000
- NoDaemon
- # Фид, надо запомнить feed.ffm, он нам потребуется при запуске ffmpeg
- File /tmp/feed.ffm
- FileMaxSize 3M
- # Ранее объявленный фид
- Feed feed.ffm
- Format flv
- VideoCodec flv
- VideoFrameRate 30
- VideoBufferSize 80000
- VideoBitRate 200
- # Качество видео от 1 до 31, 1 == отлично 31 == фи!
- VideoQMin 1
- VideoQMax 5
- # Разрешение, везде должно быть одинаково!
- VideoSize 352×288
- PreRoll 1
- # Если у вас есть микрофон, или вы транслируете видео со звуком, закомментируйте эту строчку
- Noaudio
- # Флешка test.swf для просмотра трансляции
- Feed feed.ffm
- # Будет запускаться в Adobe Flash Player
- Format swf
- VideoCodec flv
- VideoFrameRate 30
- VideoBufferSize 50000
- VideoBitRate 100
- VideoQMin 1
- VideoQMax 5
- # Разрешение, везде должно быть одинаково!
- VideoSize 352×288
- PreRoll 0
- # Если у вас есть микрофон, или вы транслируете видео со звуком, закомментируйте эту строчку
- Noaudio
Пускаем ffserver:
$ ffserver
Пускаем ffmpeg:
$ ffmpeg -s 352×288 -r 30 -f video4linux2 -i /dev/video0 http://localhost:8090/feed.ffm
-s разрешение, указанное в конфиге ffserver, -r количество кадров/секунду, -f формат, -i путь к камере (или к видео-файлу), http://localhost:PORT/FEED это адрес, где ffserver будет ждать наш поток
PS: если выдаст ошибку, то можно попробовать формат v4l (-f video4linux)
Открываем в браузере http://localhost:8090/test.swf и широко улыбаемся:)
Для отправки видео поменяем параметр -i на путь к файлу, уберём -f (ffmpeg сам определит формат файла):
$ ffmpeg -s 352×288 -r 30 -i
Как организовать потоковое вещание с веб-камеры в linux?
Приветствую!
Всех с наступившим Новым годом 2017!
Пере до мной встала задача организовать потоковое вещание с вебки на линуксе.
Вещание происходит внутри локальной сети, поэтому в качестве протокола передачи хочу использовать rtp, rtsp, или udp — по большому счёту протокол значения не имеет, но думаю не http точно.
На первом месте качество картинки. В windows эта вебка показывает очень хорошо, даже использует подсветку лица в темноте.
Так же очень желательно разделить видео и аудио на 2 разных потока, т.к. в итоге планируется раздельная обработка видео и аудио для разных задач.
На одной машине linux debian с подключенной веб-камерой, ну другой windows на которой я проверяю результаты трансляции с помощью плеера vlc.
В линуксе я не силен и задача довольно специфическая, так что гугл помог не сильно.
Что у меня получилось:
1) Получилось транслировать видео с помощью cv2 на питоне — я понимаю, это дикий костыль, но проверял работоспособность. Меня не устроило то, что качество захвата с веб-камеры при этом способе очень низкое. Изображение плохое и никакие настройки не дали приемлемого результата. Возможно дело в том, что opencv использует свой универсальный драйвер для работы с веб-камерой, но это догадка.
2) Попробовал использовать vlc — но настройки использовал из гугл-примеров. В итоге заработал только такой вариант:
При этом звук вообще отсутствовал, а изображение было серым, с со смазанными конурами того, что есть перед камерой.
3) Использовать ffmpeg вообще не вышло, на смотрящей стороне, воспроизведение хоть и не вызвало никаких ошибок, но изображения не было вовсе, как и звука. Примерный код того, что я писал:
В итоге ни один из вариантов не привёл к удачной трансляции.
Хотелось бы получить помощь с настройкой этой злосчастной трансляции, на которую я уже потратил не один час 🙂
Трансляция потока с веб-камеры с помощью ffserver
Иногда возникает задача организации трансляции видеопотока с веб-камеры в сеть. Наиболее популярным инструментом для организации такой трансляции является VLC, однако с некоторых пор в составе проекта ffmpeg разрабатывается проект ffserver, позволяющий решать туже самую задачу и имеющий более удобный способ конфигурирования. Далее будет показан пример использования ffserver для организации трансляции с веб-камеры.
Уточним начальные условия:
- Сервер под управлением Ubuntu Server 9.10;
- Веб-камера Skypemate WC-103M, подключенная к серверу.
Задача: организовать трансляцию с камеры по http в формате flv с возможностью встраивания изображения с камеры в веб-страницы.
Одной из интересных особенностей ffserver является то, что он не транслирует поток сам, а ретранслирует поток с другого источника (примерно так же, как это делает icecast). В связи с этим обычно описывают конфигурации, в которых отдельно сначала запускает ffserver, а потом источник потока (чаще всего ffmpeg). Мы же будем использовать конфигурацию, в которой ffserver сам запускает источник потока.
Приступаем к решению. Для начала установим пакет ffmpeg (ffserver является его частью):
Сразу после установки приступаем к конфигурированию. Для решения задачи достаточно привести файл «/etc/ffserver.conf» к следующему виду:
Более детальную информацию о настройке ffserver можно найти в официальной документации и примере конфигурационного файла от разработчиков продукта.
Запускаем ffserver командой:
Чтобы ffserver автоматически запускался при загрузке сервера нужно добавить эту команду в файл «/etc/rc.local«.
После запуска ffserver можно открыть в браузере адрес «http:// :12345» и увидеть страницу статуса сервера:
На статусной странице сервера кроме информации о состоянии сервера есть так же ссылки на все транслируемые потоки, так что можно сразу их протестировать.
Для картинки с камеры на html-страничку нужно добавить на неё следующий код: