В настоящее время я занимаюсь онлайн-трансляцией с 3 камер miniDV, подключенных через FireWire, что вполне соответствует вашим потребностям.
Быстрый совет: vlc + flowplayer / jw player
Прежде всего, есть два видеоформата, которые вы можете использовать в онлайн-трансляции: FLV и h264. FLV легче транскодировать, h264 имеет лучшее соотношение размер / качество, но транскодирование требует гораздо больше ресурсов процессора. Оба могут отображаться флеш-плеерами на веб-странице.
Во-вторых, потоковая инфраструктура. Так как пропускная способность вашего ноутбука ограничена (пара Мбит / с), вам необходимо получить поток на ваш сервер и там передать его клиентам. Таким образом, поток будет передаваться 1 раз серверу, а затем N раз клиентам. Вы не описали подключение к Интернету для своего ноутбука, поэтому сценарий разделен на два раздела:
Портативный компьютер подключен к общедоступному IP-адресу или вы можете подключить порт NAT к ноутбуку . Этот сценарий намного проще, так как вы можете легко и просто подключиться с сервера на ноутбук. Большим недостатком является то, что вы привязаны к одному месту (одному IP-адресу).
Ноутбук не связан с публичным адресом . Это немного сложно, но будет работать из любой сети, которая позволит вам подключиться к вашему SSH и иметь достаточную загрузку (это должно делать 1 Мбит / с).
Независимо от используемого сценария, инфраструктура будет выглядеть так
CAMERA - (usb) - LAPTOP - (network, limited upload) - SERVER - (network) - Client 0
- Client 1
- Client 2
- Client N
Потоковое с ноутбука
Захват видео с веб-камеры . Я никогда не записывал поток с локальной веб-камеры, но есть много примеров, как это сделать с помощью V4L, например:
Настройка веб-камеры . Единственная часть, которая вас должна заинтересовать:
laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2"
Который является первой частью команды VLC для подключения к веб-камере. Для более подробной информации следуйте упомянутому HOWTO. Особенно обратите внимание на часть «видео группы» и правильный путь к устройству / dev / video и / dev / audio. Они могут быть разными на вашем ноутбуке.
Перекодировать видео в FLV . Я лично использую FLV, так как он требует меньше ресурсов процессора. Я использую следующую строку:
--sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}'
Который будет транскодировать видеопоток в формат FLV с аудио MPGA (MP3 не доступен в моей Ubuntu). Samplerate как-то обязателен, без него не получится. Но вы можете выбрать меньший, например, 22050. Это позволит транскодировать видеопоток «как есть», поэтому масштаб равен 1: 1. Вы можете добавить параметры ширины и высоты или даже параметр масштаба. Посмотрите документацию VLC.
Поток это с ноутбука . Теперь вам нужно создать локальный поток, к которому будет подключаться сервер:
:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}
Это свяжет поток VLC с 0.0.0.0:8081/stream.flv. Вся команда будет выглядеть так:
laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2" --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}'
Перераспределение на сервере
Захватите поток на сервере и передайте его . Опять же, мы используем VLC для захвата и потоковой передачи. Использование основано на сценарии инфраструктуры с начала этого поста. Как я показал, VLC на ноутбуке транслирует видео на некоторый порт. Этот порт должен быть доступен с сервера. Если у вас есть публичный IP-адрес ноутбука или порт NAT, вы можете проверить его с помощью telnet:
server$ telnet public_ip_address 8081
Все, кроме «тайм-аута соединения», покажет, что вы можете подключиться к потоку вашего ноутбука. Если у вас нет общедоступного IP-адреса или вы не можете использовать порт NAT, вы должны сделать это наоборот. Вы можете SSH с ноутбука на сервер и удаленно перенаправить порт вашего ноутбука на сервер. Правильная команда SSH будет:
laptop$ ssh your_user@server_ip_address -R 8081:127.0.0.1:8081
Эта магическая команда «свяжет» порт 8081 вашего ноутбука с портом 8081 сервера. Это означает, что когда вы подключаетесь к серверу 8081, вы будете подключаться к порту 8081 вашего ноутбука через туннель SSH. Круто, да? :) Так что все, что нам нужно сделать, это подключить VLC и транслировать:
server$ vlc http://localhost:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'
Или в случае с публичным IP-адресом или NAT-портом:
server$ vlc http://public_ip_address:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'
Как и в части ноутбука, ваш VLC на сервере привязан к порту 8082. Почему 8082, а не 8081? 8081 уже занято удаленным SSH вперед. Почему мы не используем транскодированную часть, как в первом примере? Видео уже в правильном формате, поэтому все, что нам нужно сделать, это просто транслировать его как есть.
Тестирование . В обоих примерах вы можете проверить функциональность, просматривая потоки через VLC. Вы можете проверить свой локальный поток:
laptop$ vlc http://localhost:8081/stream.flv
И вы можете проверить поток вашего сервера:
laptop$ vlc http://server_ip_address:8082/stream.flv
В обоих случаях вы должны увидеть вход вашей веб-камеры.
Отображать поток в Интернете
Отображение потока в Интернете, который будет работать в большинстве случаев, осуществляется через флеш-плеер. Я попробовал два продукта, которые бесплатны для некоммерческого использования: JW Player и Flowplayer . Я остался с Flowplayer, но не помню причину, возможно, из-за плагинов (которые я не использую :)) или из-за лучшей документации.
Как отобразить поток FLV из VLC на веб-странице, описано здесь: Поток VLC на веб-сайт с asf и Flash
Поиск проблемы
Знайте о многих проблемах, которые БУДУТ возникать. Первым делом, как и во всем, прочитайте . VLC - очень болтливая программа, поэтому она расскажет вам, в чем проблема. Могут быть проблемы с разрешениями на доступ к видео / аудио устройству, отсутствующими кодеками, ошибочными параметрами --sout, ... Научитесь использовать, iftop
чтобы узнать, действительно ли данные передаются по сети и т. Д.