admin

RTMP 流媒体服务器视频直播录制并上传至OSS实现
前言现有如下需求:车辆摄像头直播的时候,在后台需要能够手动控制直播的录制,并将录制的视频上传至OSS。我们选择的流...
扫描右侧二维码阅读全文
10
2018/12

RTMP 流媒体服务器视频直播录制并上传至OSS实现

前言

现有如下需求:
车辆摄像头直播的时候,在后台需要能够手动控制直播的录制,并将录制的视频上传至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文件得以解决。

Last modification:December 10th, 2018 at 09:44 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment