Иногда возникает задача организации трансляции видеопотока с веб-камеры в сеть. Наиболее популярным инструментом для организации такой трансляции является VLC, однако с некоторых пор в составе проекта ffmpeg разрабатывается проект ffserver, позволяющий решать туже самую задачу и имеющий более удобный способ конфигурирования. Далее будет показан пример использования ffserver для организации трансляции с веб-камеры.
Уточним начальные условия:
- Сервер под управлением Ubuntu Server 9.10;
- Веб-камера Skypemate WC-103M, подключенная к серверу.
Задача: организовать трансляцию с камеры по http в формате flv с возможностью встраивания изображения с камеры в веб-страницы.
Одной из интересных особенностей ffserver является то, что он не транслирует поток сам, а ретранслирует поток с другого источника (примерно так же, как это делает icecast). В связи с этим обычно описывают конфигурации, в которых отдельно сначала запускает ffserver, а потом источник потока (чаще всего ffmpeg). Мы же будем использовать конфигурацию, в которой ffserver сам запускает источник потока.
Приступаем к решению. Для начала установим пакет ffmpeg (ffserver является его частью):
apt-get install ffmpeg
Сразу после установки приступаем к конфигурированию. Для решения задачи достаточно привести файл "/etc/ffserver.conf" к следующему виду:
# Порт, на котором будет работать ffserver Port 12345 # Адрес, на котором будет работать ffserver. # Если указать 0.0.0.0 то будут использованы все доступные адреса BindAddress 0.0.0.0 # Максимальное количество обслуживаемых соединений MaxHTTPConnections 2000 # Максимальное количество клиентов MaxClients 1000 # Максимальная используемая полоса (в килобитах) MaxBandwidth 1000 # Файл журнала. Формат подобен формату лога apache CustomLog /var/log/ffserver-access.log # Описываем источник <Feed webcam.ffm> # Временный файл для хранения промежуточных данных File /tmp/webcam.ffm # Максимальный размер файла с промежуточными данными FileMaxSize 3M # Команда для запуска источника. # Адрес для отправки данных источником автоматически будет добавлен в конец этой строки Launch ffmpeg -s 640x480 -f video4linux2 -i /dev/video0 # С каких адресов может обращаться источник ACL allow 127.0.0.1 </Feed> # Описываем первый поток. Это будет поток в формате flv <Stream webcam.flv> # Источник потока Feed webcam.ffm # Используемый формат Format flv # Используемый кодек VideoCodec flv # Частота кадров VideoFrameRate 30 # Размер буфера VideoBufferSize 80000 # Битрейт VideoBitRate 200 # Минимальное и максимальное качество VideoQMin 1 VideoQMax 5 # Размер видео. Дожно совпадать с размером видео на источнике VideoSize 640x480 # Время ожидания перед началом отправки данных клиенту (в секундах) PreRoll 1 # Звук мы транслировать не будем NoAudio </Stream> # Второй поток. Это SWF-файл с FLV-потоком внутри # Всё остальное по аналогии <Stream webcam.swf> Feed webcam.ffm Format swf VideoCodec flv VideoFrameRate 30 VideoBufferSize 80000 VideoBitRate 200 VideoQMin 1 VideoQMax 5 VideoSize 640x480 PreRoll 1 NoAudio </Stream> # При обращении к индексной страницы ffserver будем отображать текущий статус сервера <Stream index.html> Format status </Stream>
Более детальную информацию о настройке ffserver можно найти в официальной документации и примере конфигурационного файла от разработчиков продукта.
Запускаем ffserver командой:
ffserver -f /etc/ffserver.conf
Чтобы ffserver автоматически запускался при загрузке сервера нужно добавить эту команду в файл "/etc/rc.local".
После запуска ffserver можно открыть в браузере адрес "//<адрес_вашего_сервера>:12345" и увидеть страницу статуса сервера:
На статусной странице сервера кроме информации о состоянии сервера есть так же ссылки на все транслируемые потоки, так что можно сразу их протестировать.
Для картинки с камеры на html-страничку нужно добавить на неё следующий код:
<embed src="http://<адрес_вашего_сервера>:12345/webcam.swf" width=640 height=480 />
На этом всё. Приятной работы!
Автор: MooSE
Смотрите также:
Скринкастинг в Linux (FFmpeg)
Комментариев: 42 RSS
1vovans03-04-2010 00:37
Недавно надо было по работе. Переискал всё что можно. Нашёл только из вменяемого способ с VLC. И, так как никогда с этим не сталкивался, провозился весь день, пока понял что к чему и как там. А тут всё наглядно и понятно )) Всё Ъ :) как раз то, что нужно было!
Спасибо автору - MooSE! В понедельник будет чем заняться :)
2Ole Jak21-04-2010 13:22
Как реализовать нечто аналогичное на Виндусах (я имею в виду вещание с вебкасерычарез FFserver)?
3vovans21-04-2010 19:30
Ну так найдите сборку FFmpeg под винду и пробуйте настроить. FFserver является частью FFmpeg.
Я вот нашёл:
//ffmpeg.arrozcru.org/autobuilds/
А дальше надо пробовать качать, ставить, настраивать, гуглить дальше по возникающим вопросам.
Так же, не забываем про VLC, с помощью которого довольно просто можно реализовать потоковое вещание с вебкамеры по сети.
4Ole Jak21-04-2010 22:40
Не подскажите где можно добыть информации о том как через ВЛЦ устраивать вещание (хоть в каком-нибудь формате)?
5vovans22-04-2010 14:37
вот, в двух словах со скринами:
//zenway.ru/page/vlc-to-lan
6Александр17-09-2010 08:58
Как сделать то же самое но со звуком?
7vovans17-09-2010 12:27
смотря что нужно.
Скажем, у меня есть вебкамера со встроенным микрофоном. Я её подключил и немного подправил конфиги (убив пол дня на то, чтобы понять, что править:).
Так вто. Немного подправил строку с Launch:
номер hw можно эксперементально подобрать. Можно файл указать или другое устройство.
И ещё я убрал (закомментировал) первое NoAudio. В итоге я получил видео со звуком :)
Смотрите документацию, там всё рвсписано в примерах, как указывать качество звуковой дорожки, как выбирать кодек...
Для тестов можно использовать что-то вроде:
и эксперементировать с ним, пока не получите нужную картинку. Потом вносим изменения в Launch.
Ещё столкнулся с такой проблемой при получении изображения с камеры:
Решается просто. Добавляется вот это вначале:
Например:
8Александр17-09-2010 13:25
Я так и понял, что надо строку с Launch поправить, но как я не правил конфиг ничего не выходило. А вот как определить номер устройства захвата звука я нашел, нужно ввести команду:
И будет результат:
То есть, веб-камеры микрофон под номером 1
9Александр17-09-2010 15:06
vovans - спасибо за подсказки, звук появился, но как быть с синхронизацией звука и видео? Возможно ли это, я попробовал менять некоторые параметры - ничего не помогло.
10vovans17-09-2010 15:32
Ой, не знаю... сейчас времени нет тестировать... Да и на работе это странно выглядит )) подобное тестирование :)
Посмотрите тут:
//www.ffmpeg.org/ffmpeg-doc.html
на предмет sync. Есть async и т.п. А ещё стоит поискать на предмет ffmpeg и синхронизации аудио и видео. Возможно, в поисковом запросе стоит указать, что действия производятся с флешем. Возможно сам кодек специфичен...
Найдёте решение, пишите!
11Алексей24-09-2010 13:17
Сделал всё так, как Вы написали + подправил launch. Но работать не хочет. В браузере по ссылке на файло с видео открывается чёрный экран, а при попытке запустить из командной строки получается вот что:
У меня на вебморде в разделе connection status присутствует только один файл index.html... Что я не так сделал?
12vovans24-09-2010 14:53
а в Launch всё правильно прописано?
Оно работает само по себе, без конфига? Ну, то, что написано в Launch
13Аноним27-09-2010 09:28
вот так прописано.
14Алексей22-10-2010 11:50
Работает, я забыл в iptables правило прописать. Отличная статья.
15Алексей22-10-2010 15:14
Видео работает, но со звуком работать отказывается наотрез.
То есть web-камера у меня с микрофоном. Но если я в конфиге закомментирую строчку NoAudio, то видео не показывает. А если её открыть, то видео есть. Не помогает и изменение строки launch на
Хотя если использовать файл для отладки, то в файл записывается и видео и звук:
Что не так я делаю, есть идеи?
16vovans22-10-2010 16:35
а комментарий #7 перечитывали?
У меня было нечто подобное. И я закомментировал лишь одну NoAudio.
А вторую оставил как есть. И заработало. Давно это было :)
Кстати, у меня тоже камера с микрофоном и всё работало.
17Dimonyga22-11-2010 10:26
Эхх, почему я не наткнулся на эту статью месяц назад ? пришлось ворочить монстрообразный red5 для целей проведения видеоконференции аля трансляции.
18anatol08-12-2010 11:05
помогите граждане
при переходе по webcam.flv открывается новая страница с сохранение файла flv размером 187 байт.
при переходе по webcam.swf просто открывается пустая страница, но ничего не показывает, хотя по правой кнопке открывается панелька управления плеером.
в тестовый поток пишется нормально. подскажите чего поправить?
19vovans08-12-2010 11:48
Попробуйте с опциями поиграть.
Выше, в комментариях, я писал, что пробовал менять.
Должно всё работать.
20iriz17-12-2010 15:28
Всё нормально запускается. Возникла обратная проблема - как остановить сервер.
21Alexandr18-12-2010 00:20
У меня не работает вот эта строчка:
выполнение данной команды выбрасывает вот такую ошибку:
Что является следствием не верно заданных опций, в man для ffmpeg сказано:
а в вашей команде после флага -i идет только InputFile, а OutputFile файла нет. Вот сижу и не пойму как она у вас могла работать ?
22Alexandr18-12-2010 00:23
iriz: Вот вам ответ на всякий случай
23vovans18-12-2010 22:32
нет, проще всё же не так, а вот так:
Всегда помните про killall ;) с ним проще
24Александр08-02-2011 16:13
Может кто подскажет, какие параметры задать в Launch ffmpeg..... , чтобы захватывать изображение с рабочего стола, а не с веб-камеры.
25vovans08-02-2011 16:22
Эта команда выполнит захват видео с раб стола:
Вот ещё для примера:
То есть, по аналогии.
Так же посмотрите:
//zenway.ru/page/screencasting-linux-ffmpeg
26Александр09-02-2011 04:42
Захват по Вашему примеру работает для вывода в файл. А как это прописать в конфиге ffserver, чтобы также транслировать изображение в сеть, как с веб-камеры? Задача стоит следующая: необходимо транслировать на сайт мероприятие, это реализовано как описано Вами выше; также необходимо транслировать презентации, которые будут выводиться через проектор на экран. Идея - запустить два потока на разных портах, на странице будет два окошка - одно выводит зал и лектора со звуком, второе только изображение с рабочего стола компьютера.
27Виктор28-02-2011 09:15
А как его под виндой запрустить ?
28Aleks01-05-2011 08:14
Команда запуска ffm
29Иван22-07-2011 22:37
Опытным путём подтвердилось, что Launch внутри config'a гораздо капризнее, чем отдельный запуск ffmpeg с записью в файл, читаемый ffserver-ом. Поэтому лучше просто закомментировать строчку с Launch, запустить сервер, затем запустить
При вещании файла разрешение не обязательно указывать, у меня последняя версия программ без проблем как сжимала, так и растягивала картинку. То же самое с форматом, он вроде без проблем определяется автоматически.
30Андрей22-08-2011 13:08
Хотел спросить у знающих людей. Умеет ли ffmpeg подключать libavfilter при трансляции видео на ffserver? В частности надо наложить оврелеем картинку.
Сейчас я транслирую RTSP-поток с IP-камеры
Всё работает нормально
Если направить поток с оверлеем в файл
То тоже всё работает нормально.
Но если направить поток с оверлеем в ffserver
то картинки просто нет. С этим что-то можно сделать? Или в ffserver просто нет такого функционала?
31леха13-09-2011 13:14
я пробовал писать с камеры в файл вместе со звуком вроде сносно, надеюсь чем нибудь вам ето поможет)))
32Владимир28-10-2011 09:47
Добрый день!
Столкнулся с проблемой рассинхронизации видео и аудио потоков при захвате с ТВ-тюнера.
Исходные данные:
1. ТВ-тюнер, данные lspci:
03:0d.0 Multimedia controller: Philips Semiconductors SAA7134/SAA7135HL Video Broadcast Decoder (rev 01)
2. Дистрибутив: Debian Squeeze 2.6.32-5-686 (ядро стоковое)
3. ffmpeg 0.6.1+svn20101128-0.2squeeze2
4. v4l-utils 0.8.0-1
5. библиотеки:
- libavutil 50.33.0
- libavcore 0.14.0
- libavcodec 52.97.2
- libavformat 52.87.1
- libavdevice 52.2.2
- libavfilter 1.65.0
- libswscale 0.12.0
- libpostproc 51.2.0
6. Настраиваем тюнер на канал (0 - Television, 127.25 - "ТНТ", 4 - PAL, /dev/video0 - ТВ-тюнер):
v4l2-ctl --set-input=0 --set-freq=127.25 --set-standard=4 --device=/dev/video0
7. Записываем файл.
ffmpeg -f video4linux2 -deinterlace -s 384x288 -i /dev/video0 -f alsa -i hw:1,0 -f matroska -acodec mp2 -vcodec mpeg1video -b 800k -y -t30 tv_mpeg.mkv
Если добавить параметр "-r 25" выходит ошибка:
[video4linux2 @ 0x9abdca0] ioctl set time per frame(1/25) failed/dev/video0: Input/output error
33Леонид10-12-2011 23:50
У меня есть 5 GSM модемов, хочу объеденить каналы по ману отсюда _h_t_t_p://help.ubuntu.ru/wiki/ip_balancing
Подскажите, получу ли я прирост скорости при вещании видео потока указанным методом(идет ли вещание сплошным потоком или разбивается на фрагменты)?
34Hryam29-02-2012 09:52
Здравствуйте! Столкнулся с проблемой в связке ffserver и Ubuntu server 11.10. При попытке запустить сервер вываливается с ошибкой bind (port 8090): Address family not supported by protocol. Никто не сталкивался?
35user06-04-2012 11:00
Спасибо!
36Yurian09-04-2012 01:42
Господа, много чего перепробовал уже с конфигурацией настройки потокового вещания, но никак звук на swf не появляется. В файл пишет все хорошо (ffmpeg -f video4linux2 -s 320x240 -r 30 -i /dev/video0 -f avi -f alsa -i hw:1 raw.avi), а вот нет звука по ссылке на swf файл. В ссылке поменял расширение файла на flv () - звук есть, возвращаю назад, изображение есть - звука нет. Если раскомменитировать второе NoAudio выдает ошибки, если вписывает в ffserver еще и кодек для swf (AudioCodec adpcm_swf) - то ошибки уходят, но теперь видео не работает ни на flv ни на swf, ничего вобщем на работает. приходится закомментировать только NoAudio для flv а для swf оставлять... Но нужен звук для swf. Что тут поделать ума не приложу. Спасибо заранее умные люди!
37Victor15-10-2012 12:13
Я у себя в ffserver.conf оставил только flv и этот поток показываю через jwplayer.
38Victor15-10-2012 12:15
Может кто подскажет что прописать в , чтобы повысить громкость звука для flv потока.
39vovans18-10-2012 10:30
У ffmpeg есть опция -vol, у которой по уомолчанию значение 256:
Так что, можно попробовать поиграть с ней. Вот таблица:
Я так понимаю, что можно крутить и выше 2048 :) пока не добьётесь нужного результата ))
40Алексей10-12-2013 09:10
Всем привет. Такая проблемма, видео запускается, даже работает какое-то время (10 - 15 секунд) но после зависает, при обнавлении страницы, оно опять поработает несколько секунд и встает. В чем может быть беда?
Ошибок сервер не выдает. Сделал все, как в примере.
41frot06-06-2014 15:23
скажите пожалуйста а на window xp это можно устроить если можно обьясните пожалуйста заранее спасибо
42Александр10-10-2016 11:50
Хм.. а как добавить одну, две, три... камеры для трансляции.. Через ffserver это возможно вообще? Имею ввиду, клиент решил транслировать себя с вебки в сеть. Как транслировать все желаемые подключенные вебки на сервер, чтобы он потом выдвал поток в swf, дабы мы все их видели? Полюбому через сервер делать надо, дабы не нагружать зрителями канал вещающего.
Кто наведет на мысль?