最近将.net core系统从windows 环境下迁移到linux中,使用docker容器部署。但是系统中使用了ffmpeg做视频转码和截图。在windows中只需要知道ffmpeg.exe的文件位置就可以简单实现功能,但在linux中需要先安装好ffmpeg。这个时候会产生一个问题,ffmpeg是安装在linux中的, 而系统部署在docker容器中,那么容器中的站点需要访问ffmpeg工具需要将ffmpeg挂载到容器中,这一步不知道怎么实现,尝试过很多次还是没有成功。索性在linux中写个脚本来实现。当然也可以将ffmpeg直接安装在容器中,不过这样的话每个需要使用ffmpeg的容器都需要单独安装,且ffmpeg会随着容器的删除而消失。
以下是脚本内容:
#! /bin/bash
function convert_video(){
extens=("avi" "wmv" "rmvb" "3gp" "mp4")
while true
do
for file in `ls $1` #遍历文件夹下的文件;注意此处这是两个反引号,表示运行系统命令
do
if [ -d $1"/"$file ] #判断是文件还是文件夹;注意此处之间一定要加上空格,否则会报错
then #文件夹则递归遍历
convert_video $1"/"$file
else
temp=${file##*.}
exten=$(echo $temp | tr '[A-Z]' '[a-z]')
filename=$1"/"$file #输出文件地址
filenamenew=${filename/\/tempfile/} #需要转码的文件放在tempfile临时目录下,比真实目录多了这层,所以删掉/tempfile这层
newjpg="${filenamenew%.*}.jpg"
newmp4="${filenamenew%.*}.mp4"
#判断文件拓展名是否被包含
if [[ "${extens[@]}" =~ "$exten" ]]
then
/usr/local/ffmpeg/ffmpeg/bin/ffmpeg -i $filename -ss 00:00:06.000 -vframes 1 -an -y -f mjpeg $newjpg #截取视频第一张图片
if [ $exten = "mp4" ] #本身就是MP4则不需要转码, 直接复制过去
then
mv $filename $newmp4
else
/usr/local/ffmpeg/ffmpeg/bin/ffmpeg -i $filename -ac 1 -ar 11025 -y -hide_banner $newmp4 #转码
fi
#如果图片和视频都成功制作,则删除源文件
if [ -f $newjpg ]
then
if [ -f $newmp4 ]
then
rm -f $filename #删除源文件
fi
fi
fi
fi
done
sleep 2 #间隔秒数
done
}
#读取第一个参数
convert_video $1
执行脚本:/data/webapp/hotel/script/hotel_video_convert.sh /data/webapp/hotel/files
在后台执行:nohup sh /data/webapp/hotel/script/hotel_video_convert.sh /data/webapp/hotel/files &
后台带日志:nohup sh /data/webapp/hotel/script/hotel_video_convert.sh /data/webapp/hotel/files >/data/webapp/hotel/script/logs/videolog.txt 2>&1 &