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 应用程序会永远存在,但我计划让它作为我的测试应用程序一段时间。
- 仅视频,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 秒
- 仅视频,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 秒。缺点:缓冲、质量
- 视频和音频 [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>