再エンコードせずにffmpegのフレームレートを変更する


14

23.976 fps(24000/1001)のmkv(h264)ビデオがありますが、再エンコードしたり品質を落としたりせずに25fpsに変換したいと思います。私はmkvmergeがそれを行うことができることを知っていますが(オプション--default-duration '0:25fps'を使用)、可能であればffmpegから直接実行したいと思います。ドキュメントによれば、これは機能するはずです。

ffmpeg -i input.mkv -r 25 -vcodec copy output.mkv

しかし、それを実行すると、同じビデオfpsしか得られません。(存在する場合)ffmpegでそれを行う正しい方法は何ですか?


1
今のところ、FFmpegではそれは不可能だと思います。-rはストリームコピーと互換性がなく、フレームレートを変更するためのビットストリームフィルターはありません。
エリー

1
残念な。毎回mkvmergeを使用する必要があります。ありがとう
phate89

1
通常のffmpegでこれを行う複雑な方法と、古い改造バージョンのffmpegでこれを行う直接的な方法があります。興味があれば、回答として書いていきます。
Gyan

1
はい、ありがとうございます。追加のツールなしでそれをやりたいのですが(すでにffmpegが必要です)
phate89

1
@Mulvyaあなたはこの権利について話してますか?私はそれをリンクすることをためらっていましたが、それは今は古いです。しかし、通常のFFmpegでそれを行う複雑な方法に興味があります。
エリー

回答:


15

FFmpegの現在のバージョンを使用する方法は次のとおりです。これは、最初のファイルの後で入力のPTSを再スケーリングしない連結デマルチプレクサに依存しますが、固定オフセットを適用するだけです。15360(FFmpeg出力の典型的な)タイムスケールの30 fpsストリームがあるとします。つまり、フレームに0はPTSが0あり、フレームに30はPTSがあり15360ます。23040PTS値に影響を与えずにタイムスケールをに変更できれば、これは45 fpsストリームになります。

基本的に、それは以下の方法が行うことです。

。ソースプロパティを識別します。

Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1171 kb/s,
       30 fps, 30 tbr, 15360 tbn (default)

ソースのプロパティ、特に解像度とを書き留めておきtbnます。


図2(a) 。(オプション)計算を簡単にするために、タイムスケールを便利なものに変更します。

ffmpeg -i in.mp4 -c copy -an -video_track_timescale 30 in-v30.mp4

これは私たちを取得します

Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1171 kb/s, \
       30 fps, 30 tbr, 30 tbn (default

この手順を実行する場合、新しいタイムスケールは元のフレームレートと等しいか、元のフレームレートの整数倍にする必要があります。

図2b。必要なタイムスケールを計算します。これにより、ターゲットフレームレートで、ソースのxフレーム#のPTSがx新しいフレームレートと同じになるようにしますtbn。ステップ2aを実行した場合、これは非常に簡単で、単に新しいフレームレートになります。したがって、ターゲットfpsの45場合、new tbnはになります45


。ダミービデオを生成します。

ffmpeg -f lavfi -i color=s=1280x720:r=45:d=1 -profile:v main -video_track_timescale 45 0.mp4

最良の結果を得るには、解像度、H.264プロファイル、ピクセル形式、参照カウントなどのすべてのプロパティを同じにする必要があります。


4ビデオを連結します。

まずテキストファイルを作成

file '0.mp4'
file 'in-v30.mp4'

次に、連結

ffmpeg -f concat -i list.txt -c copy -video_track_timescale 45 45fps.mp4

出力ファイルでは、2番目のビデオが45 fpsで再生されます。

。さて、ダミープリロールを切り離します

ffmpeg -ss 1.1 -i 45fps.mp4 -c copy -avoid_negative_ts make_zero in45.mp4

そしてあなたは持っています

Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1757 kb/s, \
       45 fps, 45 tbr, 11520 tbn (default)

これは複雑であると私は言った!


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