FFmpeg 脚本递归地将 DTS 音频转换为 AC3

FFmpeg 脚本递归地将 DTS 音频转换为 AC3

我有带有 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或激活globstarbash 选项:

  1. 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然后又添加了它,所以我认为那是一个错误。

  2. 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
    

相关内容