Назад | Перейти на главную страницу

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

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

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

Подсказка: vlc + flowplayer / jw player

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

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

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

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

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

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

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

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

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

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

Дальнейшая информация: Red5 Справка и информация и Red5 Ссылка