我有一堆带有DTS音频的视频文件,我需要将其转换为AC3。我找到了可以执行任务不同部分的命令,但我不确定如何将它们放在一起以制作一个有效的脚本。我找到了以下脚本,它将我所有文件中的音频转换为 AC3,但我更希望它只将 DTS 音频文件转换为 AC3。脚本如下。
shopt -s globstar
for f in **/*.mkv;
do
fname="${f##*/}"
ffmpeg -i "$f" -c:v copy -c:s copy -c:a ac3 "/some/directory/$fname" &&
mv "/some/directory/$fname" "$f"
done
我还发现了这个命令,它将返回 mkv 文件正在使用的音频编解码器类型。
`ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=nokey=1:noprint_wrappers=1 input.mkv`
所以我想知道如何将两者结合起来创建一个脚本,该脚本将完成我想要它做的事情。我猜我可以在脚本开头使用 ffprobe 添加一个 if 函数?像这样的东西...
shopt -s globstar
for f in **/*.mkv;
do
fname="${f##*/}"
if ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of
default=nokey=1:noprint_wrappers=1 "$f" | egrep "DTS"; then
ffmpeg -i "$f" -c:v copy -c:s copy -c:a ac3 "/some/directory/$fname" &&
mv "/some/directory/$fname" "$f"
fi
done
这有什么问题吗?自从我上高中以来,我就没有写过脚本,因为我很无聊,所以任何帮助将不胜感激。
所以我想我想出了一些适合我的东西。我敢肯定,真正知道自己在做什么的人可以使它更清洁、更高效,但对于任何感兴趣的人来说,这就是我想出的......
shopt -s globstar
for f in **/*.mkv;
do
fname="${f##*/}"
if ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=nokey=1:noprint_wrappers=1 "$f" | egrep "dts"; then
if [[ $(ffprobe -v error -select_streams a:0 -show_entries stream=channels -of default=nokey=1:noprint_wrappers=1 "$f") > 2 ]]; then
ffmpeg -hide_banner -loglevel panic -i "$f" -c:v copy -c:s copy -c:a ac3 -b:a 640k "./Temp/$fname" &&
mv -v "./Temp/$fname" "$f"
else ffmpeg -hide_banner -loglevel panic -i "$f" -c:v copy -c:s copy -c:a ac3 -b:a 320k "./Temp/$fname" &&
mv -v "./Temp/$fname" "$f"
fi
fi
done
-Just save that to a text file and give it a name (for example DTSconverter.sh)
-Make it executable
-Put it in the root directory where the movies you wish to work on are stored
-Create a folder called 'Temp" in the that same root directory
-Execute the script by opening a terminal in the root directory and typing ./DTSconverter.sh (or whatever file name you gave the script)
这将搜索在放置脚本的目录中具有 DTS 音轨的任何电影(包括子目录(,并将音轨转码为 AC3。它还考虑立体声或环绕声轨道并相应地调整比特率。