我正在尝试编写一个脚本,将目录中的所有文件转换为 m4v,同时尝试保持相似(如果不是相同)的质量并压缩文件以减小整体大小。
我拼凑了一个小批量脚本,但它无法运行。有人能帮忙/建议如何最好地压缩并保持质量吗?
#!/bin/bash
#Convert files using ffmpeg
DIR="/Volumes/Misc/To Convert 2"
for i in $DIR; do ffmpeg -i "$i" -c:v libx264 -crf 19 -preset slow -c:a aac -strict experimental -b:a 192k -ac 2 "/Volumes/Misc/Converted/${i%.*}.m4v"
done
编辑:输出 这是我尝试运行 shell 脚本时得到的输出
ffmpeg version 2.6.1-tessus Copyright (c) 2000-2015 the FFmpeg developers
built with Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
configuration: --cc=/usr/bin/clang --prefix=/Users/tessus/data/ext/ffmpeg/sw --as=yasm --extra-version=tessus --disable-shared --enable-static --disable-ffplay --enable-gpl --enable-pthreads --enable-postproc --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libx265 --enable-libxvid --enable-libspeex --enable-bzlib --enable-zlib --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libxavs --enable-libsoxr --enable-libwavpack --enable-version3 --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvpx --enable-libgsm --enable-libopus --enable-libmodplug --enable-fontconfig --enable-libfreetype --enable-libass --enable-libbluray --enable-filters --disable-indev=qtkit --disable-indev=x11grab_xcb --enable-runtime-cpudetect
libavutil 54. 20.100 / 54. 20.100
libavcodec 56. 26.100 / 56. 26.100
libavformat 56. 25.101 / 56. 25.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 11.102 / 5. 11.102
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
/Volumes/Misc/ToConvert: Operation not permitted
答案1
一般来说,解析ls
(见下文)和类似的输出是不安全的"*.*"
。
我建议使用find
它来保护您免受带有特殊字符的不寻常文件名的侵害。
#!/bin/bash
#Convert files using ffmpeg
OrDir="/Volumes/Misc/To Convert 2/"
find "$OrDir" -type f -exec /bin/bash -c \
'f2=$(basename "$1"); \
ffmpeg -i "$1" -c:v libx264 -crf 19 -preset slow -c:a aac -strict experimental -b:a 192k -ac 2 "/Volumes/Misc/Converted/${f2%.*}.m4v" ' _ {} \;
您可以使用如下文件名进行检查
cp myfile.mpg myfile$'\n'with_new_line.mpg
参考
答案2
由于目录名包含空格,因此需要用引号引起来,"$DIR"
以防止空格被解析为单词分隔符。
我还建议您稍微改变一下 for 循环:
#!/bin/bash
DIR="/Volumes/Misc/To Convert 2"
cd "$DIR"
for i in *.*; do
ffmpeg -i "$i" -your_option "/Volumes/Misc/Converted/${i%.*}.m4v"
done