使用shell+ffmpeg提取一个文件夹下的视频中的音频

使用ffmpeg提取音频的命令:
ffmpeg -i input -vn -y -acodec copy output
最开始在命令行中用ls列出文件下的文件, 复制到sublime, 再使用正则表达式替换成ffmpeg命令, 一行一行复制粘贴到命令行中执行, 效率太低了, 于是写了脚本

basePath='D:\\Videos\\'
list=`ls $basePath` 
echo $list
for item in ${list[@]}
do
    ffmpeg -i "${basePath}${item}" -vn -y -acodec copy "${item%.*}.aac"
done

${item%.*}.aac用来把MP4替换为aac
运行后发现, 部分文件名存在空格, list是以空格为分隔符, 这就尴尬了, 谁家文件名里没有几个空格啊
继续改, ls -m能以逗号(,)为间隔符, 再添加一行EFS=',', list的间隔符设置成为逗号了, 文件名中包含逗号的情况比空格的少得多吧

basePath='I:\\Videos\\s思维漫游\\思维漫游\\'
list=`ls -m $basePath` #以逗号作为分隔符
echo $list
IFS=","
for item in ${list[@]}
do
    ffmpeg -i "${basePath}${item}" -vn -y -acodec copy "${item%.*}.aac"
done

运行发现出错, 文件名莫名其妙的有换行, 继续改, 可能的原因是ls输出的文件名有制表符之类的符号, 那就把文件名的第一个字符给删了呗, 改了过后, 还存在一个问题, 第一个文件名前没有特殊字符, 得排除, 本来想用正则匹配[\r\t\n\ ]第一个字符, 荡是老有问题, 还是最简单粗暴判断index最有效, 最后的的脚本如下:

basePath='D:\\Videos\\' #没有考虑子文件夹, 默认文件夹下都是视频
list=`ls -m $basePath` #以逗号作为分隔符
echo $list
IFS=","
isStart=1
for item in ${list[@]}
do
    if [[ isStart -eq 1 ]];then
        it=$item
        isStart=0
    else
        it=${item:1} # ls -m 出来的文件名有个\t, 需要移除首字符
    fi
    # echo "${basePath}${it}" "${it%.*}.aac"
    ffmpeg -i "${basePath}${it}" -vn -y -acodec copy "${it%.*}.aac"
done

你可能感兴趣的:(使用shell+ffmpeg提取一个文件夹下的视频中的音频)