Как транслировать видео в реальном времени с сервера Linux?

30

Вот что я хочу сделать. Осмотрелся, но не нашел прямого ответа. У меня есть окно Linux, на котором работают веб-сайты, использующие Ubuntu / MySQL / Apache. У меня также есть свой статический IP, то есть я не использую веб-хостинг. Я хотел бы иметь возможность передавать поток видео с веб-камеры на ноутбуке (предположительно под управлением Windows) на мой сервер Linux, и чтобы пользователи одного из моих веб-сайтов могли видеть это видео в прямом эфире в режиме потокового видео. Очевидно, что ноутбук должен был бы как-то проходить аутентификацию на сервере, но не должно быть никаких ограничений в отношении того, кто может просматривать живое видео на веб-сайте. Спасибо.


источник
Вы спрашиваете, как реализовать такое решение, или вы ищете готовое к использованию стороннее решение? в первом случае, так что это неправильное место для этого вопроса, я считаю, что это причина понижения голосов

Ответы:

46

В настоящее время я занимаюсь онлайн-трансляцией с 3 камер miniDV, подключенных через FireWire, что вполне соответствует вашим потребностям.

Быстрый совет: vlc + flowplayer / jw player

Прежде всего, есть два видеоформата, которые вы можете использовать в онлайн-трансляции: FLV и h264. FLV легче транскодировать, h264 имеет лучшее соотношение размер / качество, но транскодирование требует гораздо больше ресурсов процессора. Оба могут отображаться флеш-плеерами на веб-странице.

Во-вторых, потоковая инфраструктура. Так как пропускная способность вашего ноутбука ограничена (пара Мбит / с), вам необходимо получить поток на ваш сервер и там передать его клиентам. Таким образом, поток будет передаваться 1 раз серверу, а затем N раз клиентам. Вы не описали подключение к Интернету для своего ноутбука, поэтому сценарий разделен на два раздела:

  1. Портативный компьютер подключен к общедоступному IP-адресу или вы можете подключить порт NAT к ноутбуку . Этот сценарий намного проще, так как вы можете легко и просто подключиться с сервера на ноутбук. Большим недостатком является то, что вы привязаны к одному месту (одному IP-адресу).

  2. Ноутбук не связан с публичным адресом . Это немного сложно, но будет работать из любой сети, которая позволит вам подключиться к вашему SSH и иметь достаточную загрузку (это должно делать 1 Мбит / с).

Независимо от используемого сценария, инфраструктура будет выглядеть так

CAMERA - (usb) - LAPTOP - (network, limited upload) - SERVER - (network) - Client 0
                                                                         - Client 1
                                                                         - Client 2
                                                                         - Client N

Потоковое с ноутбука

  1. Захват видео с веб-камеры . Я никогда не записывал поток с локальной веб-камеры, но есть много примеров, как это сделать с помощью V4L, например: Настройка веб-камеры . Единственная часть, которая вас должна заинтересовать:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2"

    Который является первой частью команды VLC для подключения к веб-камере. Для более подробной информации следуйте упомянутому HOWTO. Особенно обратите внимание на часть «видео группы» и правильный путь к устройству / dev / video и / dev / audio. Они могут быть разными на вашем ноутбуке.

  2. Перекодировать видео в FLV . Я лично использую FLV, так как он требует меньше ресурсов процессора. Я использую следующую строку:

    --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}'

    Который будет транскодировать видеопоток в формат FLV с аудио MPGA (MP3 не доступен в моей Ubuntu). Samplerate как-то обязателен, без него не получится. Но вы можете выбрать меньший, например, 22050. Это позволит транскодировать видеопоток «как есть», поэтому масштаб равен 1: 1. Вы можете добавить параметры ширины и высоты или даже параметр масштаба. Посмотрите документацию VLC.

  3. Поток это с ноутбука . Теперь вам нужно создать локальный поток, к которому будет подключаться сервер:

    :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}'

Перераспределение на сервере

  1. Захватите поток на сервере и передайте его . Опять же, мы используем 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 вперед. Почему мы не используем транскодированную часть, как в первом примере? Видео уже в правильном формате, поэтому все, что нам нужно сделать, это просто транслировать его как есть.

  2. Тестирование . В обоих примерах вы можете проверить функциональность, просматривая потоки через 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чтобы узнать, действительно ли данные передаются по сети и т. Д.

mkudlacek
источник
1
Большое спасибо! Это было больше информации, чем я ожидал. Будет проверять VLC и использовать вашу информацию в качестве руководства.
3

Мой инструмент выбора здесь будет VLC . Это не просто многоцелевой мультиформатный видеопроигрыватель, он также способен передавать потоковые файлы в большом количестве форматов файлов и потоковых протоколов. В качестве бонуса он работает кроссплатформенно среди хостов Windows и Linux.

Мы создали нечто подобное пару лет назад, когда клиенту, использующему линию DSL с узкой полосой пропускания (128 Кб вверх по течению), нужно было транслировать свои веб-камеры, подключенные к сети, широкой аудитории. Установка VLC в качестве хоста «отражателя» осуществляла вращение сигнала кулачка, принимала основную полосу пропускания от потоковых клиентов и представляла поток в различных потоковых протоколах и форматах.

заместитель Wabbit
источник
1

Не совсем моя область знаний, но, возможно, я могу указать вам потенциальное направление.

Коммерческая реализация заключается в использовании Adobe Flash Media Server. Конечно, это может быть довольно дорогостоящим подходом. Однако есть альтернативы с открытым исходным кодом, такие как Red5 . Вам нужно будет установить сервер (он имеет зависимости Java).

После запуска сервера вы можете выбрать свой интерфейс (я думаю, что Red5 поставляется с некоторыми образцами, но вы также можете использовать JW Player с type=camera).

Интерфейс получит потоковое видео с медиа-сервера, и вы загрузите свой поток на медиа-сервер.

Дополнительная информация: Red5 Помощь & Инфо и Red5 Ссылка

cyberx86
источник
jwplayer - отличная вещь для личного использования
Кендрик