RTMP 流媒体服务器视频直播录制并上传至OSS实现 时间: 2018-12-10 09:42 分类: 服务器 ####前言 现有如下需求: 车辆摄像头直播的时候,在后台需要能够手动控制直播的录制,并将录制的视频上传至OSS。 我们选择的流媒体服务器是`nginx-rtmp-module`,它自带了直播录制功能,只需要在 nginx 配置文件里面配置一下即可开启,开启之后提供两个 http 接口来控制视频的录制: 1. http://127.0.0.1:8080/control/record/start?app=live&name=mystream&rec=rec1 2. http://127.0.0.1:8080/control/record/stop?app=live&name=mystream&rec=rec1 `Nginx`配置文件: ``` user root root; worker_processes 1; error_log logs/error.log debug; events { worker_connections 1024; } rtmp { server { listen 19350; chunk_size 4000; application live { live on; #hls on; #hls_path temp/hls; #hls_fragment 8s; recorder rec1 { record all manual; record_unique on; record_notify on; record_max_size 512M; #record_interval 0s; record_path /usr/local/nginx/temp/records; record_suffix .flv; exec_record_done /usr/local/nginx/shell/upload2oss.sh $path $filename $basename; } } #application hls { # live on; # hls on; # hls_path temp/aa; # hls_fragment 8s; #} } } http { include mime.types; default_type application/octet-stream; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; server { listen 9000; location / { root html; } location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { root html; } location /hls { #server hls fragments types{ application/vnd.apple.mpegurl m3u8; video/mp2t ts; } alias temp/hls; expires -1; } location /control { rtmp_control all; } location /records { autoindex on; autoindex_exact_size off; autoindex_localtime on; root temp; } } } ``` 需要注意的地方有三个: ``` user root root; worker_processes 1; exec_record_done /usr/local/nginx/shell/upload2oss.sh $path $filename $basename; ``` 第一个将 nginx 权限改为 root,否则有可能`exec_record_done`录制视频无法保存或者执行脚本文件里面的命令时权限不足又或者是环境不对。 第二个我也不清楚为什么`worker_processes`只能是`1`,其他的将会导致无法录制。 第三个就是调用停止录制接口时完成录制后要执行的操作,这里执行的是一个脚本,因为我们需要将录制视频上传到OSS。 `upload2oss.sh`脚本如下: ``` #!/bin/bash today=`date "+%Y%m%d"` filepath=$1 #带后缀flv文件名 filename=$2 #mp4 文件完整路径 mp4path=/usr/local/nginx/temp/records/$3.mp4 #先将 flv 视频转为 mp4 格式 #sudo /root/bin/ffmpeg -i $filepath -max_muxing_queue_size 1024 -acodec libmp3lame -ar 44100 -ac 1 -vcodec libx264 $mp4path #上面方式格式转换较慢 sudo /root/bin/ffmpeg -i $filepath -acodec copy -vcodec copy -f mp4 $mp4path #上传到阿里云OSS,ossutil64 需管理员权限运行 否则可能环境不对上传失败 sudo ossutil64 cp --meta=Content-Type:video/mp4 $mp4path "oss://cmfiles/g6video/${today}/$3.mp4" sudo rm -f $filepath sudo rm -f $mp4path #回调web接口入库 TODO #curl http://xxx.com/ ``` 录制的是`flv`格式的视频,在网页上用`flash`播放器播放是有问题的,`github`上有如下说明: > Indexed FLVs are played with random seek capability. Unindexed FLVs are played with seek/pause disabled (restart-only mode). Use FLV indexer (for example, yamdi) for indexing. > If you play FLVs recorded with the record directive please do not forget to index them before playing. They are created unindexed. 也就是说录制的`flv`视频是不带`metadata`信息的,用播放器播放时是没有时间进度并且不能快进快退的。 一开始采用`yamdi`来给`flv`视频添加`metadata`,但是生成后的`flv`文件虽然在播放器客户端软件上播放没什么问题了,但是在网页`flash`播放器上还是有问题,所以最后采用`ffmpeg`将其转码成`mp4`文件得以解决。 标签: 无