批量去除影视剧中的片头片尾
1. 下载ffmpeg并配置环境变量
ffmpeg下载地址
Windows下配置ffmpeg环境变量
2. 运行脚本
Git下载地址
Windows系统下如何运行.sh脚本文件
在Windows上面可以安装git,然后使用Git Bash运行此脚本。
视频目录一定要用英文双引号括起来。
./cut.sh "视频目录" 片头长度(秒) 片尾长度(秒)
./cut.sh "E:\Downloads\x" 20 40
脚本内容
#!/bin/bash
# 用法
# 目录一定要用英文双引号括起来
# ./cut.sh "E:\Downloads\x" 20 40
filepath=$1 #视频目录
beg=$2 #片头秒
end=$3 #片尾秒
# 将windows路径转换为linux路径(Linux系统中运行可以除掉)
########################################################
win_path=$filepath # 脚本的第一个参数就是windows路径
tmp_path=${win_path/:/} # 将冒号删掉
tmp_path=${tmp_path//\\/\/} # 将\\替换为/
disk_id=${tmp_path:0:1} # 取出第一个字母,也就是C盘的C,冒号后面第一个0指的是从下标为0的地方开始提取,第二个冒号后面的1表示提取一个字母
disk_id=$(echo $disk_id | tr [:upper:] [:lower:]) # 大写转小写
other_path=${tmp_path:1} # 路径中除了磁盘以外的部分
filepath="/"${disk_id}${other_path} # 需要将/接在路径最前方
########################################################
# 进入视频目录
cd $filepath
# 解决文件名中有空格的问题
IFS=$'\n'
#用 for 循环直接获取当前目录下的 mp4、mp3、avi 等文件循环处理,单个文件可以去掉 for 循环
filename=`ls *.{mp4,mkv,avi,ts,flv,mov,mwv}`
for i in $filename; do
#将元数据信息临时保存到 tmp.log 文件中
#echo $i
ffmpeg -i "$i" > tmp.log 2>&1
#获取视频的时长,格式为 00:00:10,10 (时:分:秒,微妙)
time="`cat tmp.log |grep Duration: |awk '{print $2}'|awk -F "," '{print $1}'|xargs`"
#echo $time
#求视频的总时长,先分别求出小时、分、秒的值,这里不处理微秒,可以忽略
hour="`echo $time |awk -F ":" '{print $1}' `"
min="`echo $time |awk -F ":" '{print $2}' `"
sec="`echo $time |awk -F ":" '{print $3}'|awk -F "." '{print $1}' `"
#echo $hour $min $sec
num1=`expr $hour \* 3600`
num2=`expr $min \* 60`
num3=$sec
#计算出视频的总时长(秒)
sum=`expr $num1 + $num2 + $num3`
#总时长减去开头和结尾就是截取后的视频时长,并且这里不需要再转回 hour:min:sec 的格式,直接使用结果即可
newtime=`expr $sum - $beg - $end`
#echo $newtime
#echo "-----------:"$newtime
#截取新视频存放目录,哪果不存在则创建
if [[ ! -d ./out ]];then
mkdir ./out
fi
# pwd
# -ss去掉片头,-t一直截到视频的尾部的总时长,减掉尾部时长的总时长,就是去掉了片尾
ffmpeg -ss $beg -i "$i" -c copy -t $newtime ./out/"$i"
done