フレームレートが.33
(3秒に1フレーム)のmp4形式のビデオがあります。フレームレートを5フレーム/秒に増やしたい。私は以下のコマンドを試しましたが、何もしません:
ffmpeg -i <input.mp4> -r 5 <output.mp4>
なぜffmpegが-r
オプションを無視しているのでしょうか?
私はこれが古い質問であることを知っていますが、現在の回答はどれも推奨される方法ではありません。
コメントに記載されているように、ビデオを再エンコードする必要があるではない場合、これを行う方法があります。 remuxing ファイルを別のコンテナー形式のMKVに変換し、MP4に再多重化する必要があります。以下は、ビデオを12フレーム/秒に変更する例です。
mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy slow-video.mp4
ビデオにオーディオが含まれている場合、ピッチを変更せずに速度を落とすこともできますが、これはロスレス変換ではありませんではありません。以下の例では、ソースビデオが24フレーム/秒であるため、ffmpegのatempoフィルターを使用してオーディオを半分(0.5)の速度に落とす必要があると想定しています。
mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy -c:a aac -filter:a "atempo=0.5" slow-video-with-audio.mp4
これは ffmpeg wiki からのガイダンスです。これらのオプションはすべて、ビデオを再エンコードする必要があることに注意してください。
Setptsビデオフィルターを使用して、ビデオストリームの速度を変更できます。次の例では、オーディオストリームは変更されないため、理想的には-anで無効にする必要があります。
ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv
フィルターは、各ビデオフレームのプレゼンテーションタイムスタンプ(PTS)を変更することで機能します。たとえば、タイムスタンプ1と2に2つの連続したフレームがあり、ビデオを高速化したい場合、それらのタイムスタンプはそれぞれ0.5と1になる必要があります。したがって、0.5を掛ける必要があります。
このメソッドは、フレームをドロップして目的の速度を達成することに注意してください。入力よりも高い出力フレームレートを指定すると、フレームの欠落を回避できます。たとえば、4 FPSの入力から最大4倍の速度(16 FPS)の入力に移動するには、次のようにします。
ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv
ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv
Minterpolateビデオフィルターを使用して、遅い/速いビデオを滑らかにすることができます。これは、「モーション補間」または「オプティカルフロー」とも呼ばれます。
ffmpeg -i input.mkv -filter "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv
その他のオプションには、slowmoVideoとButterflowがあります。オーディオのスピードアップ/スローダウン
Atempoオーディオフィルターを使用して、オーディオの速度を上げたり下げたりできます。オーディオの速度を2倍にするには:
ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv
アテンポフィルターは、0.5〜2.0の値の使用に制限されています(そのため、元の速度の半分以上に遅くなり、入力の2倍以下にまで速度が上がる可能性があります)。必要に応じて、複数のアテンポフィルターをつなぎ合わせることで、この制限を回避できます。以下は、オーディオ速度を4倍にします。
ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv
複雑なフィルターグラフを使用すると、ビデオとオーディオを同時に高速化できます。
ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv
入力ファイルに有効なフレームレートがない場合は、明示的に設定する必要があるかもしれません
ffmpeg -r 1 -i input.mp4 -r 24 output.mp4
入力ファイルが「生」ファイルとして分類された場合にのみ、変更されたフレームレートを有効にすることができました。
ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv
-f h264
を指定しないと、デフォルトで25 fpsになり、変更できません。どうやらこれはストリームにフレームレート情報がまったくなかったためであり、これはffmpegのデフォルトのフレームレートです。
どうやら-r
を出力オプションとして使用すると、フレームが複製またはドロップされるため、ビデオは同じ速度で再生されます。ただし、上記のように入力フレームレートを変更すると、フレームが失われたり複製されたりすることなく、ビデオの速度が上がりまたは遅くなります。
フレームレートを変更するこのような機能は「適合」と呼ばれ、スローモーションまたは早送りを生成するためによく使用され、数日で植物の成長を数分で示します。 ffmpegは、再エンコードせずにフレームレートの上書き/変更を許可しません 。そうした場合、継続時間は変化し、個別に修正しない限りオーディオは同期しなくなります。しかし、私はあなたの場合、フレームレートが.33のオーディオは興味がないと思います
フレームレートを変更したいだけなので、適合させたいが、ffmpegは-r
を静かに無視する 入力ファイルでフレームレートが指定されている場合。入力ファイルは.mp4形式であるため、独自のフレームレートが 再エンコードが不要な場合。このためには別のツールが必要です:mencoder。-r
に優先します。
入力ファイルに音声が含まれていないと仮定します。おそらく、フレームレートが.33のビデオであればすべて当てはまります。
$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>
MencoderはデフォルトでAVI形式で出力を生成することに注意してください。
最も簡単な方法は、次の行を含むディレクトリにBATファイルを作成することです。
@ECHO OFF
for %%f in (*.mp4) do (
echo “fullname: %%f”
del temp.mkv
mkvmerge --default-duration 0:18fps --fix-bitstream-timing-information 0 %%f -o temp.mkv
del %%f
ffmpeg -i temp.mkv -c:v copy %%f
del temp.mkv
)
同じディレクトリにmkvmergeとffmpegが必要です。品質を損なうことなく、すべてのmp4ファイルを数秒で自動的に変更します。