Debian 8.4 / Raspbian 8.0

Nginx 1.9.15

ffmpeg 2.6.8 (на стороне сервера) / avconv 11.6-6:11.6-1 ~ deb8u1+rpi1 (сбор камеры). Avconv - это FFMPEG-форк, он отлично работает на raspbian.


Схема потока

cam-1: малиновый пи / модель B / малиновый 8,0 (Джесси) / avconv

mercure: сервер Debian 8.4 (Джесси) / nginx / ffmpeg

Cam-1 [Rapivid | avconv (ffmpeg)] -> mercure [nginx rtmp / hls]


За 2 недели я прочитал много постов в Интернете о настройке сервера потокового видео в реальном времени, который принимал видеопотоки от камеры Raspberry Pi. не беспокойтесь о потоковом источнике малины, проблема не в этом. Цель состоит в том, чтобы иметь возможность читать живые потоки RTMP и HLS на удаленном сервере NGINX

факты :

Это работает, я могу читать прямой эфир с сервера RTMP/NGINX через

ffplay rtmp://mercure/live/cam-1 (defaults to 1935 port)

примечание : он не использует VLC и приложение QT5, в которое встроены виджеты QMediaPlayer / QMediaContent. Я обнаружил, что VLC создает проблемы с librtmp.so в debian и, похоже, то же самое в окне 7 (тест также не проходит). Источник: блог Debian. Возможно, проблема QT5 является побочным эффектом, поскольку QT5, возможно, использует библиотеку vlc? Я все еще расследую. Компоненты QT5 могут читать любой видеофайл на диске, но останавливаться на первом изображении при потоковой передаче по rtmp.

Модуль Nginx hls установлен.

Камера (малиновый пи)

Чтобы подключить видеопоток с камеры и опубликовать его на сервере NGINX rtmp с помощью пакетов raspivid и avconv (форк FFMPEG), используйте следующую команду:

вытянуть из рашпиля кулачок (кулачок-1):

/opt/vc/bin/raspivid -hf -vf -fl -pf main -a 8 -mm matrix -w 640 -h 480 -g 250 -t 0 -b 2048000 -o -

нажать на RTMP-сервер (Mercure)

avconv -re -i - -nostats -c copy -copyts -an -r 25 -f flv rtmp://mercure:1935/live/cam-1

полная команда, встроенная в сервис Debian,

/opt/vc/bin/raspivid -hf -vf -fl -pf main -a 8 -mm matrix -w 640 -h 480 -g 250 -t 0 -b 2048000 -o - | avconv -re -i - -nostats -c copy -copyts -an -r 25 -f flv rtmp://mercure:1935/live/cam-1

RTMP / HTTP серверная часть

Кажется, что все сообщения о состоянии этого типа конфигурации (/etc/nginx.conf выдержка). Это работает при чтении чистых rtmp-потоков через ffplay, как упомянуто выше.

rtmp {

        server {

            listen 1935;
            chunk_size 4000;

            application live {

                    live on;

            }

            application hls {
                    live on;              
                    hls on;
                    hls_path /tmp/hls;

            }
         }
}

http {

    server {

            server_name     mercure;

            location / {
                root   /var/www;
                index  index.html;
            }

            location /hls{

                    types {
                            video/MP2T ts;
                            application/vnd.apple.mpegurl m3u8;
                    }

                    root /tmp;

                    add_header Cache-Control no-cache;
                    add_header Access-Control-Allow-Origin *;

            }

    }
}

Я не очень понимаю, как nginx работает с hls ... входящий поток из avconv (ffmpeg) динамически передается в приложение /hls rtmp? при получении потока с камеры создается папка /tmp /hls вместе с файлом cam-1-0.ts ... но ничего больше ... без индекса m3u8 ...

Попытка получить доступ к ресурсу hls с помощью http://mercure/hls/cam-1 (.m3u8, .m3u ...), и в результате получается ошибка 404 HTTP: стандартное поведение http.

Я попытался скормить приложение /hls rtmp, изменив раздел конфигурации live rtmp

application live {

  live on;
  exec ffmpeg -i rtmp://mercure/live/cam-1 -c copy -f flv rtmp://mercure/hls/cam-1;

}

Я абсолютно не уверен в способности nginx управлять потоками HLS, в то время как документация указывает на это.

Мой вопрос: кому-нибудь действительно удается опубликовать входящий источник flv в поток HLS, используя транспорт FFMPEG и сервер NGINX / http - rtmp (/ hls / dash)?

1 ответ1

0

Настройка: raspivid -> ffmpeg -> rtmp -> hls [ts/m3u8] -> VideoJS

Настройка NGINX RTMP HLS очень проста, поэтому я не буду этого делать. Я использую hls_fragment размером 250 мс и hls_playlist 3 с. Не стесняйтесь использовать мой сервер NGINX RTMP HLS. Просто скопируйте и вставьте именно то, что находится в разделе rtmp, но измените 'stream_name' на что-то уникальное. Аналогично, измените это в VideoJS, чтобы вы могли воспроизвести его на своей веб-странице. Я не гарантирую, что приложение 2a будет существовать вечно, но я планирую, что оно будет моим тестовым приложением некоторое время.

  1. Только видео, A raspivid -n -t 0 -h 480 -w 854 -fps 24 -b 1536000 -o - | ffmpeg -i - -c:v copy -f flv 'rtmp://streaming.sensored.solutions/2a/stream_name' Плюсы: Самый простой, качественный, без буферизации. Минусы: ~ 10 с задержкой
  2. Только видео, B raspivid -n -t 0 -h 480 -w 854 -fps 15 -b 1080000 -o - | ffmpeg -i - -c:v copy -f flv 'rtmp://streaming.sensored.solutions/2a/stream_name' Плюсы: низкая задержка, менее 5 с. Минусы: буферизация, качество
  3. Видео и аудио [USB через Sabrent и дешевый 3,5-мм микрофон] raspivid -n -t 0 -h 480 -w 854 -fps 25 -b 2000000 -o - | ffmpeg -thread_queue_size 512 -i - -itsoffset 00: 00: 05.22 -f alsa -ac 1 -i hw: 0,0 -map 0: 0 -карта 1: 0 -c: aac -c:v копия -f flv 'rtmp://streaming.sensored.solutions/2a/stream_name' Плюсы: качество, без буферизации, синхронизированное аудио / видео. Минусы: высокий битрейт [не подходит для нескольких устройств с одинаковой пропускной способностью], задержка ~ 12 с - 15 с

VideoJS:

    <!--Note, you should including the following in the HEAD of your HTML file: 
    <link href="http://videojs.github.io/videojs-contrib-hls/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
    -->
    <div class="container" id="videojs_container">
        <section class="starter-template">
            <video id=video-js-player width=854 height=480 class="video-js vjs-default-skin" controls autoplay="true" data-setup="{}" preload="auto">
                <source src = "http://streaming.sensored.solutions/2a/stream_name/index.m3u8" type = "application/x-mpegURL">
            </video>
        </section>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="http://videojs.github.io/videojs-contrib-hls/node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
    <script src="http://videojs.github.io/videojs-contrib-hls/js/ie10-viewport-bug-workaround.js"></script>
    <link href="//vjs.zencdn.net/5.4/video-js.css" rel="stylesheet">
    <script src="//vjs.zencdn.net/5.4/video.js"></script>
    <script src="http://videojs.github.io/videojs-contrib-hls/node_modules/videojs-contrib-hls/dist/videojs.hls.min.js"></script>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .