ffmpegはサブディレクトリの.aviファイルにまたがっています。

ffmpegはサブディレクトリの.aviファイルにまたがっています。

状態:

  • macOS 10.13.6の実行とbash 5.0.17(1)の使用
  • 複数のファイルを含む多くのサブディレクトリ。
  • サブディレクトリで特定の拡張子(.avi)を持つファイルをフィルタリングする必要があります。
  • すべての.aviファイルは.mp4を使用して処理してリミックスする必要がありますffmpegffmpegリミックスするには、次の構文を使用してください。ffmpeg -i in.avi -c copy out.mp4
  • 出力形式:ソース.aviファイルと同じフォルダにあり、同じファイル名を使用します(拡張子.aviを除く)。

ファイル構造の例:

$ find . -maxdepth 2
.
./abc
./abc/abc.avi
./xyz
./xyz/xyz.avi.mp4
./123
./123/123.avi

この場合、ファイルの合計をフィルタリング./abc/abc.aviし、./123/123.avi正規表現の合計を使用してこれを実行できますfind

$ find -E . -iregex ".*\.avi"
./abc/abc.avi
./123/123.avi

目的のリミックス.mp4出力ファイル名は次のとおりです。

./abc/abc.mp4
./123/123.mp4

私がすることができます:

  1. スクリプトを使用して1つのコマンドでこれらのファイルをすべてコンテナに.aviリミックスしますか.mp4?目的の出力ファイル名を指定しながら、出力をfind入力にパイプする方法がわかりません。ffmpeg
  2. 元の.aviファイルを削除しても再多重化に成功した場合にのみ該当しますか?

ベストアンサー1

私はArch Linuxユーザーではなく、この答えをArch Linux環境で書いていますが、ffmpegFreeBSDとMacOS-Xでは2つの要件を満たすことができます。たとえば、次のようになります。bash

$ from=avi; to=mp4; 
$ find -E . -type f -iregex ".*\.avi" -execdir \
  sh -c 'file=$(basename $3); (ffmpeg -i $file.$1 -c copy $file.$2) 2>/dev/null && \rm $3' shellproc "$from" "$to" {} \;

上記の行から:

  • -type f以前に含めました。 「一般ファイル」タイプのファイルのみを実行すると時間が節約さ-iregex ...れます。stat
  • $1代表する$from
  • $2代表する$to
  • $3コマンド{}の結果を示します。find
  • shellprocinは、...shellproc "$from" "$to" {} \;次のコマンドを使用して実行されるシェルプロセスを識別するために使用されるランダムな表示ですsh -c 'file=$(basename $3); (ffmpeg -i $file.$1 -c copy $file.$2) 2>/dev/null && \rm $3'。このラベルは、シェルから出力されるすべてのエラーメッセージの前に付けられます。これがすることです。

欲しいものを達成する方法はいくつかあります。ぜひご覧ください。回答著者:Kusalalananda、フレーズの詳細を学びますfind ... -exec...

おすすめ記事