web-dev-qa-db-ja.com

Bashスクリプトを使用して.movファイルを再帰的に検索し、ffmpegを使用してそれらを.mp4に変換する方法

私はビデオ会社のMacシステムで作業しており、大きな中間ビデオファイルを含む多くのフォルダーとサブフォルダーをクリーンアップする必要があります。

だから私はffmpegを使って多くの.movファイルをh.264.mp4ファイルにバッチ変換する方法を探していました。次のようなスクリプトを使用してバッチ変換を行うためのコードをいくつか見つけました

for f in '*.mov';
   do ffmpeg -i $f -c:v libx264 -f mp4 "${%f.mov}.mp4" ; 
done

ただし、これはスクリプトが実行されている現在のフォルダーでのみ機能します。movファイルを見つける方法を探している間再帰的に、それらすべてをバッチ変換します。

現時点では、私にとって有効なソリューションは少し力ずくであると感じています。私はffmpegを見つけて実行するだけです。

 find . -name '*.mov' -type f -exec ffmpeg -i {} -c:v libx264 -f mp4 {}.mp4 

ただし、私が抱えている問題の1つは、この形式では.movを.mp4に置き換えることができないため、出力で.mp4が{}に追加され、ファイルが* .movになることです。 .mp4

それに加えて、これはバッチをレンダリングするための最も安全な方法でも、最も良い方法でもないと思います。

Ffmpegのバッチを作成するより安全な方法、または端末をあまり使用しない方法があるかどうか疑問に思っていました。これにより、名前の問題が解決される可能性があります。または、 'for f in * mov'コマンドで最大5つのビデオを再帰的に検索する方法があります。 +フォルダの深さ。

どんな助けでも大歓迎です。

2
JasonD

これはあなたが望むことをする簡単なbashスクリプトです(私は思います):1)すべてのMOVファイルを再帰的に見つけて変換します2).movファイル拡張子を.mp4ファイル拡張子に適切に置き換えます。

#!/bin/bash
while read mov; do
  mp4=$(echo "$mov"|sed -e 's|\.mov$|.mp4|i')
  if [ "$mov" == "$mp4" ]; then
    echo "Failed to generate unique MP4 filename for file $mov"
    exit 1
  fi
  echo ffmpeg -i "$mov" -c:v libx264 -f mp4 "$mp4"
done < <(find . -type f -iname '*.mov')

書かれているように、これは実際には変換を行いません。実行されるffmpegコマンドをエコーするだけです。希望どおりに動作することを確認したら、ffmpegコマンドの前にある「echo」を削除するだけです。

2
atreyu

これは役に立ちますか?

for i in `find . -name "*.mov" -print0| xargs -0`; do echo ffmpeg -i $i -c:v libx264 -f mp4 ${i%.mov}.mp4; done

生成されたffmpegコマンドに問題がなければ、エコーを削除します。

これは、1つ以上のスペースを含むファイル名を考慮に入れます(-print0およびxargs -0を介して)

0
nagu