web-dev-qa-db-ja.com

ffmpegを使用してフレームレートを変更する

ビデオクリップ(MP4、yuv420p)を30 fpsから24 fpsに変換しようとしています。フレーム数が正しいため、出力は30fpsで20分から24fpsで25分に変更されます。他のすべては同じままでなければなりません。

Ffmpegで試すすべてがフレームレートを変換しますが、フレーム数を変更して同じ期間を維持するか、フレームレートを変更せずに期間を変更します。

だから私は通常、次のようなことを試みています。

ffmpeg -y -r 30 -i seeing_noaudio.mp4 -r 24 seeing.mp4

(私はWindows上でこれを行っていますが、通常はLinux上にあります)。これはフレームレートを変換しますが、フレームをドロップするため、合計期間は変更されません。

または私が試しました

ffmpeg -y -i seeing_noaudio.mp4 -filter:v "setpts=1.25*PTS" seeing.mp4

期間は変更されますが、フレームレートは変更されません。

確かに、再エンコードせずに、または一部の人々が元の生のフレームに戻ることを提案することなく、単一のffmpegコマンドでこれを行うことができるはずです。

助けてください

29
J Brand

再エンコードあり:

ffmpeg -y -i seeing_noaudio.mp4 -vf "setpts=1.25*PTS" -r 24 seeing.mp4

再エンコードなし:

最初のステップ-ビデオを生のビットストリームに抽出する

ffmpeg -y -i seeing_noaudio.mp4 -c copy -f h264 seeing_noaudio.h264

新しいフレームレートでのRemux

ffmpeg -y -r 24 -i seeing_noaudio.h264 -c copy seeing.mp4
34
Gyan

入力ファイルの前に、「-r」オプションで目的のフレームレートを指定するだけです。

ffmpeg -y -r 24 -i seeing_noaudio.mp4 seeing.mp4

オプションは、その後の次のファイルに影響します。入力ファイルの前に "-r"を指定すると、ビデオが指定されたフレームレートでエンコードされたかのようにヘッダーを強制的に再解釈します。再圧縮は必要ありません。フレームレートを変更するためにaviファイルヘッダーに直接パッチを適用する小さなユーティリティavifrate.exeがありました。上記のffmpegコマンドは基本的に同じことを行いますが、ファイル全体をコピーする必要があります。

7
MKaama

私の知る限り、再エンコードせずにffmpegでこれを行うことはできません。作業していた他の素材に合わせて、25fpsの24fpsファイルが必要でした。コマンドffmpeg -i inputfile -r 25 outputfileを使用しました。このコマンドはwebm、matroska入力で完全に機能し、エンコーダーを使用してh264、matroska出力を生成しました:Lavc56.60.100

6fpsでも同じことを実現できますが、先ほど述べたように、再生時間は変わりません(ほとんどの場合、オーディオ同期が失われるため、これは良いことです)。これが要件に合わない場合は、 この回答 を試してみることをお勧めしますが、私の経験では、出力ファイルを再エンコードします。

最高のフレーム精度を得るには、以前に提案したように、未加工のストリームにデコードすることをお勧めします。以下に再現するスクリプトを使用します。

#!/bin/bash
#This script will decompress all files in the current directory, video to huffyuv and audio to PCM
#unsigned 8-bit and place the output #in an avi container to ease frame accurate editing.
for f in *
do
ffmpeg -i "$f" -c:v huffyuv -c:a pcm_u8 "$f".avi
done

明らかに、このスクリプトは現在のディレクトリ内のすべてのファイルがメディアファイルであると想定していますが、選択した特定の拡張子に処理を制限するために簡単に変更できます。生のストリームに解凍すると、ファイルサイズがかなり大きくなることに注意してください。

2
Elder Geek

fpsフィルターの使用を検討できます。ビデオの再生速度は変更されません。

ffmpeg -i <input> -filter:v fps=fps=30 <output>

Fpsを59.6から30に削減するためにニースで働きました。

1
kelin

このコマンドを使用しても、ビデオの継続時間は変更されません。

ffmpeg -i input.mp4 -r 24 output.mp4
0
Tim Le