树莓派ffmpeg直播推送,nginx视频流接受转码,客户端hls rtmp视频流拉流
树莓派利用ffmpeg将摄像头视频流以rtmp视频流的格式,推送到安装有nginx,nginx-rtmp的云服务器端,在云服务器端会进行视频流的录制成flv格式或者转码成m3u8格式的hls视频流
ffmpeg,rtmp,hls简单了解
- ffmpeg
ffmpeg用于记录,转换和流传输音频和视频的完整的跨平台解决方案。
这是ffmpeg的官方对ffmpeg的定义,ffmpeg官网FFmpeg
说人话就是,这个工具特别强大,只要是图片视频相关的,他都能做,比如视频flv转成mp4格式,比如加个水印,比如做个直播推流到b站,播放视频收看直播等等… - rtmp
RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信,flv格式。rtmp协议是由adobe公司开发,所以目前浏览器需要拉取rtmp视频流需要使用flash插件,因而在移动端浏览器无法播放rtmp视频流。
优点:视频音频能够做到实时传输,延迟较小。
缺点:- 对流媒体服务器的带宽要求较高,如果服务器或者客户端浏览器带宽比较小会出现画面卡顿的情况。
- 大部分手机端浏览器无法播放rtmp视频流。
- hls
- HLS (HTTP Live Streaming)是Apple的动态码率自适应技术。主要用于mac osx PC和Apple终端的音视频服务。包括一个m3u(8)的索引文件,TS媒体分片文件和key加密串文件。
- 工作原理:将整个视频切分成很多切片ts文件,用一个m3u8文件作为切片ts文件的索引文件,浏览器播放视频时,浏览器一边下载ts文件,一边渲染视频,而不用将整个文件下载下来之后再播放。
- 优点:画面几乎无卡顿,在移动端适配性较好,可以直接播放。
- 缺点:在直播系统中,相较于rtmp视频流,hls延迟较大。很多window的浏览器如chrome浏览器无法直接播放m3u8格式文件(Edge浏览器可以),但html5可以借助于hls.js播放m3u8格式视频流。
作者:yywfy的昵称
链接:https://www.jianshu.com/p/6de22b88dc73
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
准备工作
- 带有摄像头的树莓派
- 一台云服务器(Linux系统),如果没有也没有问题
- 一台电脑
- 一台手机
树莓派安装ffmpeg
sudo apt-get install ffmpeg
云服务器安装nginx,nginx-rtmp
sudo apt-get install nginx
sudo apt-get install libnginx-mod-rtmp
云服务器端 nginx.conf配置rtmp
sudo vim /etc/nginx/nginx.conf
在http模块上方写入下列配置
rtmp {
server {
listen 1935; #监听的端口号
application myapp { #rtmp视频流
live on;
}
application hls { #hls视频流
live on;
hls on;
hls_path /tmp/hls;
hls_fragment 2s;
#hls_playlist_length 12s;
}
}
}
简单介绍一下上面的参数
- rtmp 表示nginx接受rtmp视频流
- listen 1935 表示接受rtmp视频流的端口号
- application myapp 表示接受的应用名为myapp,可以自定义
- live on 表示处于接受rtmp的状态中
- hls on 将接受到的rtmp视频转码成hls视频(也就是m3u8格式),切片成.ts文件,.m3u8作为索引文件
- hls_path /tmp/hls 表示rtmp转码成hls视频流,也就是.ts .m3u8文件存储的地址,这个文件夹的权限要注意哦
- hls_fragment 2s 表示每个切片ts文件的大小,太大了对于带宽较小的服务器会有卡顿
- hls_playlist_length 12s; 表示播放列表的长度,进度条显示的长度,默认自动适应
服务器端 nginx.conf配置拉流的http接口
sudo vim /etc/nginx/nginx.conf
将下面的配置,写在http{server{}}里面
location /live {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /tmp/hls/; #这个路径和rtmp中hls切片保存路径一致
add_header Cache-Control no-cache;
# cross-origin 解决html5播放hls时出现跨域问题
add_header Access-Control-Allow-Origin *;
}
注意事项:
- ts切片保存路径要和rtmp模块的一致
- 记得加上这行代码
d_header Access-Control-Allow-Origin *;
避免网页端播放出现跨域问题
开启云服务器的防火墙端口,启动nginx
- 注意给云服务器的1935,80端口放行,阿里云就直接在控制台安全组自定义一个开放端口。
- 启动nginx
sudo service nginx start
树莓派开始推流
- 推流到hls应用
ffmpeg -i /dev/video0 -s 640x360 -vcodec libx264 -max_delay 100 -r 20 -b:v 1000k -b:a 128k -f flv rtmp://47.100.78.117:1935/hls/room1
注意window如果使用摄像头推流需要在ffmpeg后面添加 -f dshow
加载一个流媒体驱动
解析一下其中的参数
-i /dev/video0
表示视频输入源是 /dev/video0 即摄像头 ls /dev/就能查看到有一个video0的设备,也可以-i input.mp4
用视频文件作为输入源
-s 640x360
表示图像的分辨率,如果太大了,容易出现卡顿情况
-vcodec libx264
一种视频编码格式
-max_delay 100
最大延迟时间
-r 20
这个表示每秒拍摄多少帧,也会影响的画面是卡顿
-b:v 1000k
表示传输视频流的码率
-b:a 128k
表示传输音频流的码率
-f flv rtmp://47.100.78.117:1935/hls/room1
表示传输的格式是flv,因为rtmp协议的视频流以flv格式传输,后面接的rtmp://ip:1935/hls/roomNum
ip地址也可以换成服务器的域名,hls是nginx.conf配置好的rtmp应用的名称,room1自定义的名称,类似于房间号
你只需要改ip地址即可
- 推送到rtmp应用
ffmpeg -i /dev/video0 -s 640x360 -vcodec libx264 -max_delay 100 -r 20 -b:v 1000k -b:a 128k -f flv rtmp://47.100.78.117:1935/myapp/room1
改了rtmp应用的名称myapp
拉流
- hls拉流
拉流地址
http://47.100.78.117/live/room1.m3u8
live nginx.conf中location后的名称
room1 推流的房间号
手机端直接打开拉流地址即可播放,window用Edge浏览器播放,或者vlc播放器,但是谷歌火狐无法播放
- rtmp拉流
在vlc中串流地址写入下面的
rtmp://47.100.78.117:1935/myapp/room1
实际效果图
vlc播放rtmp视频流
win10自带的Edge浏览器播放hls视频流
手机端查看hls视频流