あまり正確ではないように見えるパラメータを使用-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
私が試したいくつかの入力ファイルでフィルターが機能していません。ジョブは正常に(?)実行されますが、エンコードプロセスが停止することはないため、毎回コマンドプロンプトを閉じる必要があります。
select
してみましたaselect
。Select
ビデオのフレーム精度ですaselect
が、サンプル精度ではありません。実際、正確であるとはほど遠い。単純な-ss
-to
パラメータを使用するよりもはるかに悪い結果が得られます。そのため、今のところ、select
フィルターと-ss
-to
パラメーターの組み合わせを使用して、最も正確な切断を実現します。しかし、それは汚れた方法です。コマンドラインとその結果を追加した最初の投稿をご覧ください