ffmpegを使用して破損したビデオファイルを再帰的に回復する

ffmpegを使用して破損したビデオファイルを再帰的に回復する

私はディレクトリから始めて(findの代わりに)fdとffmpegを使って固定コピーをエクスポートするコードを持つことにかなり近いと思います。ここでは疑似コードでifステートメントを作成しました。

for i in $(fd -e .mp4 -e .avi); 
do if [ffmpeg -v error -i "$i" -f null - 2] has an error, then
ffmpeg -err_detect ignore_err -i video.mkv -c copy video_fixed.mkv;
done

私は「致命的」を使用するときに致命的なエラーがなければ、ファイルが空かゼロになると信じています。どちらが簡単かはわかりませんが、「エラー」がより適切だと思います。

修正したいのは、エラーがある場合はIFステートメントを実行し、エラーがなければ何もしないことです。エラーが発生すると、video_fixed.mkvが生成されます。しかし、私はそれがvideo_fixed.mkvになりたくないので、$ iと同じファイル名と元のファイルと同じファイル拡張子を持ち、元のファイルをそれに変更したいと思います。また、$ i がファイル名であるか、完全なパスを含むファイル名であるかどうかわからないため、問題が発生します。最後の「/」の後の文字列をファイル名でキャプチャする必要があります。

比較が難しい場合は、エラーの有無にかかわらずすべてのファイルをコピーする必要があります。そのためには、コピーに名前を付けて上書きして元のものと同じにする必要があります。

ありがとう

答え1

まだIFステートメントを試していませんが、十分に進歩しています。

ビデオファイルを含むフォルダで次のコマンドを実行します。

すべてのコンテンツを保存するには、CorrectedVideosという重複フォルダを作成します。

IFS=$'\n'; find . -type d | xargs -I {} mkdir -p /home/Rob/Desktop/correctedVideos/{}; for i in $(fd -e .mp4 -e .avi); do ffmpeg -err_detect ignore_err -i "$i" -c copy "/home/Rob/Desktop/correctedVideos/$i"; done

ここで、i は for ループや入力などの変数であり、必ずしも i 以外のものにすることができます。

ファイル名のみ表示: ${i##*/}

現在のディレクトリのファイルパスのみを表示します。${i%/*}

現在のディレクトリの相対ファイルパスとファイル名が表示されます: "$i"

したがって、「$i」は ${i%/ と同じです。}/${i##/}

「~」ではなく絶対パスを使用する必要があります。

PSコピーを含むパラレルフォルダを作成せずに既存のフォルダにコピーを作成する場合は、2つの方法があります。

方法 1: 1 つのフォルダー内の各ファイル (サブフォルダーがある場合は問題が発生するため、サブフォルダーがあるフォルダーでは使用しないでください):

IFS=$'\n'; for i in $(fd -e .mp4 -e .avi); do echo ffmpeg -err_detect ignore_err -i "$i" -c copy "copied_$i"; done

方法2:サブフォルダを含むフォルダの場合、コマンドが実行される最上位フォルダにファイルがあると機能しません。

IFS=$'\n'; for i in $(fd -e .mp4 -e .avi); do ffmpeg -err_detect ignore_err -i "$i" -c copy "$PWD/${i%/*}/copied_${i##*/}"; done

関連情報