最开始的时候有尝试手动搭,但是问题无数,而且使用体验并不好,本次使用docker搭建。
docker环境
docker的安装这里不做记录,网上有很多教程,而且这个很少出问题
安装nginx+rtmp
- nginx-rtmp github :https://github.com/tiangolo/nginx-rtmp-docker
- 这里使用docker仓库里
tiangolo/nginx-rtmp的,如果不需要更改配置的话,直接拉下来运行即可。
# 拉取镜像 docker pull tiangolo/nginx-rtmp # 根据镜像运行容器 docker run -d -p 1935:1935 --name nginx-rtmp tiangolo/nginx-rtmp
- 但是有时,我们需要自定义nginx-rtmp服务器的设置,需要映射nginx-rtmp中的video到容器外部,那样需要制作我们自己的docker文件和nginx.conf。
Dockerfile
FROM tiangolo/nginx-rtmp COPY nginx.conf /etc/nginx/nginx.conf
nginx.conf 这里开启了普通的rtmp推流 和 hls推流。hls推流会把flv文件切片生成多个ts。
worker_processes auto;
rtmp_auto_push on;
events { }
# 多个端口 直播流配置
rtmp {
server {
listen 1936;
application live {
live on;
# 非常重要, 设定让ngnix断开阻塞中的连接, 才能触发exec_record_done
# 以及客户端的LFLiveKit reconnectCount自动重新连接才会好用
drop_idle_publisher 5s;
#record all;
#record_path /tmp;
#record_max_size 10485760K;
#record_unique off;
#record_append on;
}
}
}
rtmp {
server {
#端口
listen 1935;
# RTMP 直播流配置
application rtmplive {
# 非常重要, 设定让ngnix断开阻塞中的连接, 才能触发exec_record_done
# 以及客户端的LFLiveKit reconnectCount自动重新连接才会好用
drop_idle_publisher 5s;
live on;
}
# HLS 直播流配置
application hls {
live on;
record all;
record_path /tmp;
record_max_size 10485760K;
record_unique off;
record_append on;
hls on;
hls_path /tmp;
hls_fragment 5s;
}
}
}
# HLS 拉流配置 http://123.57.164.21:8080/hls/cs.m3u8
http {
server {
listen 8080;
location /hls {
types {
application /vnd.apple.mpegurl m3u8;
video /mp2t ts;
}
#访问权限开启,否则访问这个地址会报403
autoindex on;
#视频流存放地址,与上面的hls_path相对应,这里root和alias的区别可自行百度
alias /tmp;
expires -1;
add_header Cache-Control no-cache;
#防止跨域问题
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}
}
}
把Dockerfile和nginx.conf放在同级目录,CD到这个目录,运行下面的命令,创建镜像和运行容器。
//创建容器 docker build -t nginx-rtmp . //运行容器。注意这里面开启了1935推流端口 和 8080拉流端口。 docker run -d -p 1935:1935 -p 8080:8080 -v /tmp/video:/tmp --privileged=true --name nginx-rtmp nginx-rtmp 注意:-v /tmp/video:/tmp 的意思是把容器内部的/tmp文件夹 映射到外部/tmp/video 文件夹。这样在容器外部就能看到视频直播的文件了。特别需要注意 /tmp/video 文件夹的权限设置成777.
然后我们可以用一些推流工具,来进行推流直播,比如手机端的易推流。我们也可以自己开发工具来推流,比如IOS的话,可以用LFLiveKit框架,进行视频Rtmp推流。

然后可以使用VLC, 或者易推流来拉流。我们也可以自己开发工具来推流,比如IOS的话,可以用Ijkplayer框架,来进行Rtmp视频拉流。如果是hls拉流的话,原生AVPlayer就能直播播放出来(AVPlayer原生支持HLS)。


我们可以看到推流到服务器以后,在服务器上的tmp目录下,生成flv 和 很多ts切片文件。

因为ngnix启动了hls,所以我们可以通过hls来拉流。通过html,直接用safari浏览器就可以打开观看(hls拉流地址:http://123.57.164.21:8080/hls/cs.m3u8)。
html 代码
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>HTML5播放视频</title> </head> <body> <video width="352" height="288" controls> <source src="http://123.57.164.21:8080/hls/cs.m3u8" type="application/vnd.apple.mpegurl"> 浏览器不支持 video 标签。 </video> </body> </html>

附录:Rtmp 和 HLS对比


注意:这样其实存在一个问题,推流是由本地推到服务器,拉流也是本地从服务器上拉,这样会多耗一倍的带宽,最好的解决方案是,由服务器进行推流,终端进行拉流,所以下面继续安装ffmpeg进行推流
安装ffmpeg进行本地推流
这里使用docker仓库里tiangolo/nginx-rtmp的,直接拉下来运行即可
# 拉取镜像 docker pull jrottenberg/ffmpeg # 根据镜像运行容器 docker run -it --name app_ffmpeg -p 8080:8080 -v /home/app_ffmpeg/:/mnt/app/ --entrypoint=‘bash’ jrottenberg/ffmpeg # 把文件导入到docker容器目录中 docker cp /usr/video/a.mp4 app_ffmpeg:/tmp/workdir # 查看容器,启动容器,进入容器 docker ps -a docker start app_ffmpeg docker attach app_ffmpeg # 然后就可以推流啦(这里就可以使用局域网IP进行推流) ffmpeg -re -stream_loop -1 -i a.mp4 -vcodec copy -acodec copy -f flv rtmp://172.17.10.10:1935/live/cs