ffmpeg selectフィルターを使用して正確なフレームでビデオをカットする


16

あまり正確ではないように見えるパラメータを使用-ssおよび-to検索する代わりに、特定のフレーム番号のビデオをカットできますか?例えば;

ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm

[80番目のフレームと560番目のフレームが含まれています。したがって、合計で(560-80 +1)フレームになります]

答えと少し検索した後、いくつかのコマンドを試しました。しかし、これまでのところ、私は受け入れられる方法を見つけることができませんでした。

誰かが250番目と750番目のフレームの間でビデオストリームをカットしたい場合、これが道です。出力として501フレームを提供します。

注: movie.mp4には25 fpsがあり、そのオーディオサンプルレートは48kです。

ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm

予想どおり、出力の長さは正確に20秒です。

オーディオに同じ方法を使用する:

ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm

予想外に、これは非常に低い精度を持っています。オーディオが20秒に等しい960001(960k + 1)サンプルが提供されているはずです。しかし、代わりに、出力の長さは20.505秒で、984240のサンプルがあります。また、期間を長くすると、エラーも増加します。

次に、-ss -toパラメータを使用してオーディオストリームをカットしようとしました。

ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm

古い古典的な方法ははるかに優れています。出力は20.003秒で、960144個のサンプルがあります。さらに、期間を延長してもエラーは増加せず、エラーは一定であり、その入力ファイルには常に144サンプルの余剰があります。

要約: selectフィルターはほとんどの場合うまく機能しますが、選択はうまくいきません。古典的な-ssパラメーターは、オーディオではより良く機能しますが、サンプル精度ではありません。また、-vf select-ssパラメータを一緒に使用することはできません。これは-ss、オーディオとビデオの両方のストリームに影響を与える一方で、オーディオのみに影響を与えるためです。

したがって、メディアファイルを正確にカットするには、次の3つの手順を実行する必要があります。

ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm 
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm 
ffmpeg -i v_stream.webm -i a_stream.webm -c:v copy -c:a copy  movie-between_10th_and 20th_seconds.webm

これにより、最も正確な結果が得られます。ビデオの長さは20.000秒、フレーム精度のオーディオの長さは20.003秒で、サンプルは960144です。ビデオストリームと完全には一致しませんが、問題ありません。サンプルの余剰は144個のみです。最大の欠点は、ファイルを切りたいときはいつでも、単純なジョブのために3つのコマンドを送信する必要があり、a_stream.webmとv_stream.webmの2つの不要なファイルが作成されることです。そして、select私が試したいくつかの入力ファイルでフィルターが機能していません。ジョブは正常に(?)実行されますが、エンコードプロセスが停止することはないため、毎回コマンドプロンプトを閉じる必要があります。


この質問を投稿する前に、私はそのページを読みました。そのページは私を助けませんでした。入力に変数fpsがある場合、その方程式を使用して単純に計算できますか?そうは思わない。また、まだ「-ss」が正確な位置を与えるとは思わない。フレームごとにシークする方が良いと思います。
破壊者

-ssフレーム精度である(参照ここ)。実際に可変fps入力を持っていますか?私の答えはselect、フレーム番号を指定できるフィルターの使用について言及しているメーリングリストスレッドにリンクしています。試しましたか?
slhck

私はビデオとオーディオのストリームにフィルターを使用selectしてみましたaselectSelectビデオのフレーム精度ですaselectが、サンプル精度ではありません。実際、正確であるとはほど遠い。単純な-ss -toパラメータを使用するよりもはるかに悪い結果が得られます。そのため、今のところ、selectフィルターと-ss -toパラメーターの組み合わせを使用して、最も正確な切断を実現します。しかし、それは汚れた方法です。コマンドラインとその結果を追加した最初の投稿をご覧ください
15年

ffmpegバージョン?
FIE

とにかくフレーム番号でカットしようとしているのはなぜですか。そのような精度が必要な場合は、avidemuxを使用してみませんか?また、元の問題は、最も近いキーフレームを選択するためかもしれません。
FIE

回答:


3

オーディオはフレームではなく秒から取得されるため、ビデオをカットする場合は、ビデオfps×20秒を次のように計算する必要があります:23.97 fpsの20秒= 479.4

最後の1秒間は完全なfpsを取得できないため、フレームの切断は正確ではありません。そのため、オーディオはさらに数秒、またはわずか0.5秒または少し多かれ少なかれ取得します。フレームの代わりに秒を使用して正確なカットを取得して、ffmpegに指示してください。そして、余分なフレームを1つ取得した場合、250番目と750番目のフレームを250番目と749番目のフレームに変更するとどうなりますか?!マイナス1を使用すると、常にフレーム数を取得できます!


実際には、音声は数秒ではなくサンプルから
取得され
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.