回答:
私はこれが古い質問であることを知っていますが、現在の答えはどれも推奨される方法ではありません。
コメントで述べたように、ビデオを 再エンコードする必要がない場合にこれを行う方法があります。ファイルを別のコンテナー形式の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からのガイダンスです。これらのオプションはすべて、ビデオを再エンコードする必要があることに注意してください。
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
mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv
、MKVコンテナのフレームレートを変更します。MKVに再多重化してMP4に戻すことも、MP4用に直接実行するツールを見つけることもできます。ビデオのxコーディングはCPUを集中的に使用し、損失が大きいため、恐ろしいオプションです。
入力ファイルに有効なフレームレートがない場合は、明示的に設定する必要があるかもしれません
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形式で出力を生成することに注意してください。
r
が出力スイッチとして指定されている場合、ffmpegは、入力のフレームレートに関係なく、指定されたフレームレートで出力を生成します。r
が入力スイッチとして指定されている場合、ffmpegは必要に応じてフレームを複製またはドロップして、入力の1秒あたりの指定された数のフレームをフィルター/エンコーダーに送ります。
r
入力スイッチの場合の動作は、以前の.mp4形式の実験、Malvineousのメモ(このページ)、バグの説明403 trac.ffmpeg.org/ticket/403と矛盾します。r
出力で使用される場合の説明は、再エンコード時に発生しますが、OPのシナリオは、0.33のフレームレートを持っているという事実により、適合ケース(再エンコードなしの固定フレームレート)のようです。
r
fpsで新しいストリームを生成する必要があります。
-r
。この使用法は、OPに対応する以前の実験に影響を与えることはできませんでした。これは、適合するケースを考えると、ffmpegからコピーパラメーターを削除したことがなく-r
、無視されたためです。私は機能リクエストを書きました:trac.ffmpeg.org/ticket/5170
最も簡単な方法は、次の行を含むディレクトリに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ファイルを数秒で自動的に変更します。