web-dev-qa-db-ja.com

ffmpegでMP4ビデオのフレームレートを変更する

フレームレートが.33(3秒に1フレーム)のmp4形式のビデオがあります。フレームレートを5フレーム/秒に増やしたい。私は以下のコマンドを試しましたが、何もしません:

ffmpeg -i <input.mp4> -r 5 <output.mp4>

なぜffmpegが-rオプションを無視しているのでしょうか?

8
firemonkey

私はこれが古い質問であることを知っていますが、現在の回答はどれも推奨される方法ではありません。

ロスレス(ビデオ)再多重化

コメントに記載されているように、ビデオを再エンコードする必要があるではない場合、これを行う方法があります。 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ガイダンス

これは ffmpeg wiki からのガイダンスです。これらのオプションはすべて、ビデオを再エンコードする必要があることに注意してください。

ビデオの高速化/低速化

Setptsビデオフィルターを使用して、ビデオストリームの速度を変更できます。次の例では、オーディオストリームは変更されないため、理想的には-anで無効にする必要があります。

ビデオの速度を2倍にするには、以下を使用できます。

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

ビデオを遅くするには、1より大きい乗数を使用する必要があります。

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
7
pseudosavant

入力ファイルに有効なフレームレートがない場合は、明示的に設定する必要があるかもしれません

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4
6
Martin Beckett

入力ファイルが「生」ファイルとして分類された場合にのみ、変更されたフレームレートを有効にすることができました。

ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv

-f h264を指定しないと、デフォルトで25 fpsになり、変更できません。どうやらこれはストリームにフレームレート情報がまったくなかったためであり、これはffmpegのデフォルトのフレームレートです。

どうやら-rを出力オプションとして使用すると、フレームが複製またはドロップされるため、ビデオは同じ速度で再生されます。ただし、上記のように入力フレームレートを変更すると、フレームが失われたり複製されたりすることなく、ビデオの速度が上がりまたは遅くなります。

3
Malvineous

フレームレートを変更するこのような機能は「適合」と呼ばれ、スローモーションまたは早送りを生成するためによく使用され、数日で植物の成長を数分で示します。 ffmpegは、再エンコードせずにフレームレートの上書き/変更を許可しません 。そうした場合、継続時間は変化し、個別に修正しない限りオーディオは同期しなくなります。しかし、私はあなたの場合、フレームレートが.33のオーディオは興味がないと思います

フレームレートを変更したいだけなので、適合させたいが、ffmpegは-rを静かに無視する 入力ファイルでフレームレートが指定されている場合。入力ファイルは.mp4形式であるため、独自のフレームレートが-rに優先します。 再エンコードが不要な場合。このためには別のツールが必要です:mencoder。

入力ファイルに音声が含まれていないと仮定します。おそらく、フレームレートが.33のビデオであればすべて当てはまります。

$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>

MencoderはデフォルトでAVI形式で出力を生成することに注意してください。

1
Tankman六四

最も簡単な方法は、次の行を含むディレクトリに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ファイルを数秒で自動的に変更します。

0
Peder Gerdin