Linux使用shell定时任务实现ffmpeg视频转码和截图

最近将.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 &

发布了65 篇原创文章 · 获赞 28 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_26900081/article/details/100698566