Raspberry Pi(Debian 8.4)上的 NGINX / RTMP / HLS 直播

Raspberry Pi(Debian 8.4)上的 NGINX / RTMP / HLS 直播

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 型 / raspbian 8.0 (Jessie) / avconv

mercure:debian 服务器 8.4 (Jessie) / nginx / ffmpeg

凸轮-1[rapivid | avconv (ffmpeg)] ->水星[nginx rtmp/hls]


两周以来,我在网上读了很多关于设置实时视频流服务器的帖子,该服务器从 Raspberry Pi 摄像头接收视频流。不用担心 Raspberry 流媒体源,问题并不在这里。目标是能够在远程 NGINX 服务器上读取 RTMP 和 HLS 实时流

事实 :

它可以工作,我可以通过以下方式从 RTMP/NGINX 服务器读取直播流

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

笔记:它不使用 VLC 和嵌入 QMediaPlayer / QMediaContent 小部件的 QT5 应用程序。我发现 VLC 在 debian 上引入了 librtmp.so 问题,在 Windows 7 上似乎也是如此(测试也失败)。来源:debian 博客。QT5 问题可能是副作用,因为 QT5 可能使用 vlc 库?我仍在调查。QT5 组件可以读取任何磁盘视频文件,但在使用 rtmp 流式传输时会在第一张图像上冻结

Nginx hls模块已安装。

相机(树莓派)

要连接来自摄像机的视频流并使用 raspivid 和 avconv (FFMPEG fork) 包将其发布到 NGINX rtmp 服务器,使用的命令是:

从锉刀凸轮 (cam-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 摘录)。如上所述,当通过 ffplay 读取纯 rtmp 流时,这种方法有效

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 行为。

我尝试通过更改实时 rtmp 配置部分来为 /hls rtmp 应用程序提供数据

application live {

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

}

尽管文档中说明了 nginx 管理 HLS 流的能力,但我对它根本没有信心。

我的问题是:是否有人真的成功使用 FFMPEG 传输和 NGINX / http - rtmp(/hls/dash)服务器将传入的 flv 源发布到 HLS 流?

答案1

设置:raspivid -> ffmpeg -> rtmp -> hls[ts/m3u8] -> VideoJS

NGINX RTMP HLS 设置非常简单,所以我就不多说了。我使用 hls_fragment 大小为 250ms 和 hls_playlist 为 3s。请随意使用我的 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.5mm 麦克风] 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 -map 1:0 -c:a aac -c:v copy -f flv 'rtmp://streaming.sensored.solutions/2a/stream_name' 优点:质量好、无缓冲、音频/视频同步。缺点:比特率高 [不适合使用相同带宽的多个设备]、延迟约 12 秒 - 15 秒

视频JS:

    <!--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>

相关内容