web-dev-qa-db-ja.com

FFmpegスクリプトで再帰的に変換するDTSオーディオをAC3に変換する

個別にac3に変換できるdtsオーディオのビデオがありますが、束をバッチ変換する必要がありますが、方法がわかりません。

これは、個別のファイルに対する私の作業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が個別の変換されたmkvを一時ディレクトリに処理するため。

また、誰かがアイデアを持っている場合の次のステップ:

  • Temp dirで処理されたビデオを使用して、変換されていない元のファイルを置き換えます。
2
Set

再帰的にするには、findを使用するか、globstar bashオプションをアクティブにします。

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