视频录制shell脚本

一、需要环境

1.开发语言

shell

2.操作系统

脚本是在centos7下写的,linux下应该都可以运行。不过不同linux的shell可能有差别,如果在其他linux使用,最好先测试下。

3.命令依赖

3.1 ffmpeg

二、部署

1.上传脚本和ffmpeg。

2.将ffmpeg拷贝到/usr/local/bin/下面。

2.1 ffmpeg下载地址

https://ffmpeg.org/download.html

3.stream.sh脚本可以部署在任何的路径。

4.录制的视频保存在余stream.sh根目录的下一级的video目录下面。

5.脚本路径结构

.
├── ffmpeg
├── logs
│   ├── info.log
│   └── test.log
├── stream.sh
└── video
    └── test.mp4

三、代码

# 日志处理函数
function logs(){
   datetime=$(date)
   mkdir -p $basepath/logs;
   echo $datetime $@ 2>&1 >> $basepath/logs/info.log 
   echo $datetime $@ 2>&1 >> $basepath/logs/$stream_name.log 
}

function help(){
    echo -e "\033[44m帮助:\033[0m"
    echo -e "\033[42m使用方式:\033[0m"
    echo "    $0 stream_url 120 932539-202110121706 5000000"
    echo "    stream_url 为流地址 保存文件名 录制时长(秒)  超时时间(微秒) "
    echo -e "    \033[41m录制时长、保存文件名、超时时间可以不设置。录制时长默认为10分钟,文件保存名默认为流名字加当前时间(精确到秒),超时时间默认为5s。\033[0m"
    echo -e "\033[45m示例:\033[0m"
    echo "    $0 "
    echo "    stream_url http://void.2cq.com/liverepeater/932539.flv"
    echo " "
}

function stream_record(){
 
    stream_url=$1
    save_stream_name=$2
    record_time=$3
    timeout=$4

    # 记录录制内容
    logs "录制信息: url:$stream_url file_name:$save_stream_name.mp4 录制时间:$record_time 超时时间:$timeout" 

    mkdir -p $basepath/video    
    # 开始录制
    ffmpeg -rw_timeout $timeout -t $record_time -i $stream_url -acodec copy -vcodec copy -f flv -y video/$save_stream_name.mp4 >> $basepath/logs/$save_stream_name.log 2>&1 
}

# 主函数
function main(){
    # 获取程序所在地址
    basepath=$(cd `dirname $0`; pwd)

    logs "---------- start ----------"

    # 判断是否查看帮助
    if [[ $1 == '-h' ]];then
        help
        exit 1
    fi 

    # 判断传递的参数是否正确
    if [[ $# < 1 ]];then
        echo -e "\033[41mError:缺少参数!\033[0m"
        echo ""
        help
        exit 1
    fi

    # 获取流地址
    stream_url=$1

    # 默认流名字
    if [[ ! -n $2 ]];then
        # 获取流名字
        date_time=$(date "+%Y%m%d-%H%M%S")
        stream=$(echo $stream_url|awk -F '/' '{print $5}'|awk -F '.' '{print $1}')
        streamname=$(echo $stream|awk -F '?' '{print $1}') 
        stream_name=$streamname-$date_time
    else
        stream_name=$2
    fi
         
    # 默认录制时长
    if [[ ! -n $3 ]];then
        record_time=10
    else
        record_time=$3
    fi



    # 设置超时时间
    if [[ ! -n $4 ]];then
        content_timeout=5000000
    else
        content_timeout=$4
    fi

    stream_record $stream_url $stream_name $record_time $content_timeout 
    logs "---------- end ----------"
}

# 程序入口
main "$@"

四、运行方式

1.说明

stream.sh stream_url 120 932539-202110121706 5000000

stream_url 为流地址 录制时长(秒) 保存文件名 超时时间(微秒)

录制时长、保存文件名、超时时间可以不设置。

录制时长默认为10分钟。

文件保存名默认为流名字加当前时间(精确到秒)。

超时时间默认为5s。

2.日志

脚本会生成两个日志,一个是info,一个是基于保存文件名的日志。

info日志保存基础信息。基于保存文件名的日志保存ffmpeg拉流详细信息。

3.示例

3.1 示例一

sh stream.sh http://void.test.com/liverepeater/932285.flv test 60 200000

3.2 示例二

 sh stream.sh "rtmp://testpull.2cq.com/liverepeater/900003?wsSecret=40fc70ef8ff5fa205dd035bfc784eb49&wsTime=616fd750" test 60 200000 

3.3 ps如果流地址后面有防盗链等自定义的信息。比如上面的防盗链,则一定要对整个url加上双引号,否则会有问题。

Previous Post

文件大小与文件占用空间的区别

Next Post

lscpu

Related Posts