Задачка была следующая: Выполнить захват видео с внешнего видео-устройства, например web-камеры и трансляция его в сеть в формате flv.
Решение задачки оказалось достаточно простое. Для реализации задуманного понадобились всего 2 софтины: ffmpeg и video4linux2 (v4l2).
Ffmpeg ставится сразу с несколькими утилитами, из которых мне понадобились 2: ffmpeg и ffserver
Шаг 1: Подготовка софта и оборудования
Чтобы поставить самый новый пакет ffmpeg, подключил их официальный репозиторий (смотреть тут: Debian 6 – Дополнительные репозитарии)
Установка:
1 2 3 4 |
apt-get update apt-get install ffmpeg ffmpeg version 1.0.6 Copyright (c) 2000-2013 the FFmpeg developers built on Mar 25 2013 |
Для удобной настройки web-камеры полезно установить утилиты v4l-conf и v4l-utils:
1 |
apt-get install v4l-conf v4l-utils |
Теперь можно считать, что установка софта завершена в полной мере и сейчас желательно подключить (или переподключить) web-камеру.
Перед началом настройки сервера вещания необходимо проверить настройки web-камеры.
Чтобы посмотреть список подключенных в данный момент видео устройств, воспользуемся утилитой v4l2-ctl (она уже должна стоять):
1 2 3 4 5 6 |
/web/cron_scripts# v4l2-ctl --list-devices USB Camera (041e:401c) (usb-0000:00:1d.1-1): /dev/video1 USB2.0 PC CAMERA (usb-0000:00:1d.7-4): /dev/video0 |
Как видно из ответа, подключены 2 web-камеры: video1 и video0
Утилитой v4l2-ctl можно получить список настраиваемых параметров камеры, и установить любое значение в эти параметры.
На самом деле, пользоваться этой утилитой очень просто. Она маленькая, простая лаконичная, и обычная справка v4l2-ctl –help ответит на все вопросы.
Скажу лишь, что мне пришлось через нее только проставить более высокое разрешение на камере и все, больше никаких действий не потребовалось.
Шаг 2: Настройка сервера
Для организации вещания в пакет ffmpeg входит утилита ffserver. Она достаточно проста в настройке и при этом имеет мощный функционал.
Суть работы очень проста. При запуске ffserver он анализирует свой файл настроек и на основе него создает feed.
Feed в конфигурационном файле имеет всего 3 важных параметра (4ый Launch не обязательный):
1 2 3 4 5 6 7 8 9 10 11 |
<Feed webcam.ffm> # Временный файл для хранения промежуточных данных File /tmp/webcam.ffm # Максимальный размер файла с промежуточными данными FileMaxSize 1M # Команда для запуска источника. # Адрес для отправки данных источником автоматически будет добавлен в конец этой строки # Launch ffmpeg -s 640x480 -f video4linux2 -i /dev/video0 # С каких адресов может обращаться источник ACL allow 127.0.0.1 </Feed> |
Фиды – источники данных, их имена используются в этом же конфиге для настройки самих потоков. Мы можем, например, создать сразу 2 потока одной камеры с разными разрешениями, битрейтами, форматами.
Конфигурация ffserver по умолчанию расположена тут /etc/ffserver.conf
В моем случае, используется один фид и один поток.
Пример моей конфигурации ffserver.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
Port 8090 # Адрес, на котором будет работать ffserver. # Если указать 0.0.0.0 то будут использованы все доступные адреса BindAddress 0.0.0.0 # Максимальное количество обслуживаемых соединений MaxHTTPConnections 2000 # Максимальное количество клиентов MaxClients 1000 # Максимальная используемая полоса (в килобитах) MaxBandwidth 9000 # Файл журнала. Формат подобен формату лога apache CustomLog /var/log/ffserver-access.log # Описываем источник <Feed webcam.ffm> # Временный файл для хранения промежуточных данных File /tmp/webcam.ffm # Максимальный размер файла с промежуточными данными FileMaxSize 1M # Команда для запуска источника. # Адрес для отправки данных источником автоматически будет добавлен в конец этой строки # Launch ffmpeg -s 640x480 -f video4linux2 -i /dev/video0 # С каких адресов может обращаться источник ACL allow 127.0.0.1 </Feed> # Первый поток <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.conf можно пробовать запускать сервер:
1 |
ffserver -d -f /etc/ffserver.conf |
-d – для вывода статусных сообщений, можно убрать.
При успешном запуске должна вывестись некоторая информация и в конце: FFserver started.
Если FFserver не запустился из-за ошибки в конфиге, он выдаст соответствующее предупреждение.
Чтобы не держать консоль с запущенным сервером постоянно открытой, запускать сервер удобно в виртуальной вкладке при помощи утилиты screen, или в качестве демона (сам не пробовал).
Шаг 3: Подача данных на источник ffserver с камеры, вывод плеера
Запуск сервера это только пол дела, сам по себе он видео генерировать не будет, мы только настроили в нем место (feed), куда его надо поставлять.
А поставлять туда видео будет сам ffmpeg. Пример запуска этого процесса, как было в моем случае:
1 |
ffmpeg -f v4l2 -s 640x480 -r 30 -i /dev/video0 http://127.0.0.1:8090/webcam.ffm |
Я тут указываю разрешение, скорость кадров fps (-r 30), видео устройство (/dev/video0), и адрес на источник feed, куда выполнять отправку видео с камеры: http://127.0.0.1:8090/webcam.ffm
Все, после запуска последней рассмотренной команды, можно пробовать смотреть онлайн видео на страничке сайта.
Для вывода плеера на страничке, достаточно указать такой код:
1 2 3 4 |
<object width="640" height="480" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"> <param name="src" value="http://lineradio.fm:8090/webcam.swf" /> <embed width="640" height="480" type="application/x-shockwave-flash" src="http://lineradio.fm:8090/webcam.swf" /> </object> |
Просмотров : 23215
пробывал в винде начать трансляцию с юсб камеры. не осилил момент как её обозначить в строке с параметрами