Вот что я хочу сделать. Осмотрелся, но прямого ответа не нашел. У меня есть Linux, на котором запущены веб-сайты с использованием Ubuntu / MySQL / Apache. У меня также есть собственный статический IP-адрес, то есть я не использую веб-хостинг. Я хотел бы иметь возможность передавать потоковое видео с веб-камеры на ноутбуке (предположительно под управлением Windows) на мой сервер Linux, и чтобы пользователи одного из моих веб-сайтов могли видеть это видео в режиме реального времени, когда оно транслируется. Очевидно, что ноутбуку нужно будет каким-то образом аутентифицироваться на сервере, но не должно быть никаких ограничений на то, кто может просматривать живое видео на веб-сайте. Спасибо.
В настоящее время я разрабатываю онлайн-трансляцию с 3 камер miniDV, подключенных через FireWire, что очень похоже на ваши потребности.
Подсказка: vlc + flowplayer / jw player
Прежде всего, есть два формата видео, которые вы можете использовать в онлайн-трансляции: FLV и h264. FLV легче перекодировать, h264 имеет лучшее соотношение размер / качество, но перекодирование требует гораздо большего количества ЦП. Оба могут быть отображены флеш-плеером на веб-странице.
Во-вторых, потоковая инфраструктура. Поскольку ваша полоса пропускания с ноутбука ограничена (пара максимумов Мбит / с), вам нужно получить поток на свой сервер и там повторно передать его клиентам. Таким образом, поток будет перетекать 1 раз на сервер, а затем N раз на клиентов. Вы не описали подключение к Интернету для ноутбука, поэтому сценарий разделен на две части:
Ноутбук подключен к общедоступному IP-адресу ИЛИ вы можете подключить NAT к ноутбуку. Этот сценарий намного проще, поскольку вы можете легко и просто подключиться с сервера к ноутбуку. Большой недостаток в том, что вы привязаны к одному месту (одному IP-адресу).
Ноутбук не связан с публичным I адресом. Это немного сложно, но будет работать из любой сети, которая позволит вам подключаться к серверу по 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
чтобы увидеть, действительно ли данные проходят через сеть и т. д.
Мой любимый инструмент здесь был бы vlc. Это не просто многоцелевой многоформатный видеопроигрыватель, он также может транслировать множество форматов файлов и потоковых протоколов. В качестве бонуса он работает кросс-платформенно между хостами Windows и Linux.
Мы создали нечто подобное пару лет назад, когда заказчику, использующему узкополосную линию DSL (128 КБ восходящего потока), требовалось транслировать потоки своих сетевых веб-камер для широкой аудитории. Установка VLC в качестве хоста «отражателя» выполняла ротацию сигналов кулачка, брала основную нагрузку на полосу пропускания от потоковых клиентов и представляла поток в различных протоколах и форматах потоковой передачи.
Не совсем моя область знаний, но, возможно, я смогу указать вам в потенциальном направлении.
Коммерческая реализация предполагает использование Adobe Flash Media Server. Конечно, это может быть довольно затратным подходом. Однако есть альтернативы с открытым исходным кодом, такие как Красный5. Вам нужно будет установить сервер (он имеет зависимости от Java).
После того, как у вас будет запущен сервер, вы можете выбрать свой интерфейс (я считаю, что Red5 поставляется с некоторыми образцами, но вы также можете использовать JW Player с участием type=camera
).
Внешний интерфейс получит потоковое видео с медиа-сервера, и вы загрузите свой поток на медиа-сервер.
Дальнейшая информация: Red5 Справка и информация и Red5 Ссылка