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


8

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

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

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


フレームを複製/ドロップするのではなく、ビデオを高速化/低速化する場合は、superuser.com / questions
Peter Cordes

回答:


7

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

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

コメントで述べたように、ビデオを 再エンコードする必要がない場合にこれを行う方法があります。ファイルを別のコンテナー形式の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のアテンポフィルターを使用して半分(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

1
再多重化するだけで高速化/低速化することは可能ですが、FFmpegはその方法を知りません。たとえば、mkvの場合、mkvtoolnixがそれを実行できます。たとえばmkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv 、MKVコンテナのフレームレートを変更します。MKVに再多重化してMP4に戻すことも、MP4用に直接実行するツールを見つけることもできます。ビデオのxコーディングはCPUを集中的に使用し、損失が大きいため、恐ろしいオプションです。
Peter Cordes

低いフレームレートへの再多重化は、リソースをあまり消費しないロスレスアプローチであるため、好ましいと完全に合意されています。実際には、MP4でそれを行うための適切なツールは見つかりませんでした。私は最近は試していませんが、この回答を最初に書いたときは、MP4-> MKV-> MP4の再多重化を行っていたため、mkvtoolnix、ffmpeg、またはmp4boxを使用して動作させることができませんでした。私はあなたが提案するパラメーターを試さなければなりません。
疑似サバント

6

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

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4

これは、本当に再多重化する必要がある場合にのみトランスコードします。(実際にビデオの速度を落とす/速度を上げるのではなく、フレームを複製/ドロップしたい場合を除きます。)
Peter Cordes

3

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

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

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

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


1
私の役に立つ答え。ここでの再エンコードは不要
yota 2018年

1

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

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

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

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

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


1
これは間違っています。rが出力スイッチとして指定されている場合、ffmpegは、入力のフレームレートに関係なく、指定されたフレームレートで出力を生成します。rが入力スイッチとして指定されている場合、ffmpegは必要に応じてフレームを複製またはドロップして、入力の1秒あたりの指定された数のフレームをフィルター/エンコーダーに送ります。
Gyan

r入力スイッチの場合の動作は、以前の.mp4形式の実験、Malvineousのメモ(このページ)、バグの説明403 trac.ffmpeg.org/ticket/403と矛盾します。r出力で使用される場合の説明は、再エンコード時に発生しますが、OPのシナリオは、0.33のフレームレートを持っているという事実により、適合ケース(再エンコードなしの固定フレームレート)のようです。
Tankman六四

1
ここに貼り付けチェックレポート。上部のコマンドライン、入力と出力のメタデータ、最後にnoに注意してください。エンコードされたフレームの数。
Gyan

1
OPは単にファイルを適合させる必要があるが、コピースイッチが指定されていないため、指定されたコマンドは再エンコードされることに同意しました。そのシナリオでは、ffmpegはrfpsで新しいストリームを生成する必要があります。
Gyan

説得力のあるサンプル出力を提供してくれたMulvyaに感謝します。はい、あなたは正しい使用法です-r。この使用法は、OPに対応する以前の実験に影響を与えることはできませんでした。これは、適合するケースを考えると、ffmpegからコピーパラメーターを削除したことがなく-r、無視されたためです。私は機能リクエストを書きました:trac.ffmpeg.org/ticket/5170
Tankman六四

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.