一、需要环境
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加上双引号,否则会有问题。