最开始的时候有尝试手动搭,但是问题无数,而且使用体验并不好,本次使用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