我有带有 dts 音频的视频,我可以单独将其转换为 ac3,但我需要批量转换一堆,但不知道如何操作。
这是我针对单独文件工作的 ffmpeg:
for f in *.mkv;
do
ffmpeg -i "$f" -metadata:s:a:0 language=eng -metadata:s:a:0 title="AC3 5.1" -map 0:v -map 0:a:0 -map 0:a -map 0:s -c:v copy -c:a copy -c:s copy -c:a:0 ac3 -b:a:0 640k "/srv/dev-disk-by-label-hel/temp/${f%.mkv}".mkv;
done
所有视频都位于我的主要“媒体”文件夹下的单独文件夹中。一些文件夹中有空格。在工作脚本中,文件被处理到单独的临时目录中。
我需要帮助:
对于 ffmpeg 来说,以递归方式转换所有 mkv。
用于 ffmmpeg 将单独转换的 mkvs 处理到我的临时目录。
如果有人有想法的话,下一步是:
- 使用临时目录中已处理的视频替换原始未转换的文件。
答案1
为了使其递归,您可以使用find
或激活globstar
bash 选项:
find -exec
:find . -name '*.mkv' -exec ffmpeg -i {} -metadata:s:a:0 language=eng -metadata:s:a:0 title="AC3 5.1" -map 0:v -map 0:a:0 -map 0:a -map 0:s -c:v copy -c:a copy -c:s copy -c:a:0 ac3 -b:a:0 640k /srv/dev-disk-by-label-hel/temp/{} \;
里面
{}
的-exec
将被转换为当前文件名。我没有理会你的 ,${f%.mkv}".mkv;
因为它与输入文件名相同,你删除了 ,.mkv
然后又添加了它,所以我认为那是一个错误。globstar
. 该选项允许**
递归到 0 个或更多子目录。shopt -s globstar for f in **/*.mkv; do fname="${f##*/}" ffmpeg -i "$f" -metadata:s:a:0 language=eng -metadata:s:a:0 title="AC3 5.1" -map 0:v -map 0:a:0 -map 0:a -map 0:s -c:v copy -c:a copy -c:s copy -c:a:0 ac3 -b:a:0 640k "/srv/dev-disk-by-label-hel/temp/"$fname"; done
这是您可以最轻松地将文件复制回原始文件的方法。只要你不介意覆盖原件, 你可以做:
shopt -s globstar for f in **/*.mkv; do fname="${f##*/}" ffmpeg -i "$f" -metadata:s:a:0 language=eng -metadata:s:a:0 title="AC3 5.1" -map 0:v -map 0:a:0 -map 0:a -map 0:s -c:v copy -c:a copy -c:s copy -c:a:0 ac3 -b:a:0 640k "/srv/dev-disk-by-label-hel/temp/$fname" && mv "/srv/dev-disk-by-label-hel/temp/$fname" "$f" done