再エンコードせずにビデオのフレームレートを変更する方法


14

MP4ビデオのフレームレートを変更しようとしています(120fpsのGoProビデオです。スローモーション効果のために30fpsで再生したいです)。

これにはavconvを使用しています:

avconv -i SourceMovie.mp4 -vf setpts=4.0*PTS -r 30 DestMovie.mp4

技術的には機能しますが、映画を再エンコードします。遅いことに加えて、それは明らかに品質の問題です。技術的には、ビデオのヘッダーにfpsを設定する方法が必要ですが、どうすれば変更できますか?(avconv以外のツールも動作します。)

回答:


15

MP4Boxでできます。

コマンド

MP4Box -add SourceMovie.mp4#video -raw 1 -new test

ファイルtestとを作成しますtest_track1.h264。サポートされているフレームレート(この例では30)でmp4ファイルを作成できるようになりました。

MP4Box -add test_track1.h264:fps=30 -new DestMovie.mp4

MP4Boxはgpacパッケージの一部であるため、インストールされていることを確認してください。


6
それは本当に簡単ではありませんが、私はそれを得ました-あなたは2つのステップでそれをする必要があります。最初にビデオストリームをrawとして個別に抽出し(MP4Box -add source.mp4#video -raw 1 -new test)、次にMP4として再度保存します(MP4Box -add test_track1.h264:fps=30 -new dest.mp4)。オーディオトラックを追加することもできます(#audioを使用)。
エボマイク

-single最初のコマンドにはオプションを使用することをお勧めします。2 MP4Box -single 1 -raw 1 SourceMovie.mp4つではなく1つのファイルのみを作成しますSourceMovie_track1.h264
多様なノック

6

ビデオ(コンテナ)のヘッダーのフレームレートを変更しても、ビデオストリーム(またはオーディオストリーム)自体には影響しません。再エンコードが唯一のオプションです。

ビデオストリームにはタイムスタンプがあり、ほとんどのビデオでは、フレーム間圧縮のためにフレームが相互に依存しています。一部のプレーヤーは、埋め込みコマンドなどによってではなく、ビデオの速度を上げたり下げたりできます。containercommandがそうするように要求するとき、プレーヤーはその場でフレームレートを変更できません。ビデオファイルは仕様から外れてしまい(つまり、標準に準拠していない)、プレーヤーの99.9%がそれに従うことを拒否します。コーディングし直さずに必要なことを行うことはまったく不可能です。もちろん、編集の最後のステップまで再コーディングを待つことができます。


1
どうもありがとう!愚かな質問-なぜですか?各フレームには、プレーヤーに特定の再生速度を強制するタイムスタンプがありますか?まったく同じフレームが必要です。異なるレートで再生するだけです。
エボマイク

2
こんにちは、マイク、あなたの質問は愚かではありません、率直に言ってあなたが考えるのは非常に賢い方法です。あなたの考え方が好きです。これをコメントボックスに入れるには長すぎたため、回答に情報を追加しました。
トム

ありがとう!それは非常に有益です。今、再コーディングについては-avconvのようなものでそれを行うための最良の方法は何ですか?上記のコマンドラインを使用しましたが、結果としてひどい品質になりました-ほとんどすべてのマクロブロックを見ることができました。
エボマイク

1
ビデオストリームのタイムスタンプは、生のh.264ビットストリーム自体ではなく、コンテナに格納されていると思います。タイミングを変更するだけで、順序は変更しない限り、どのフレームをいつ表示するかは、トランスコードする必要はなく、単にリマックスするだけです。(。あなたはXcodeの操作を行う場合は、より高速なハードウェアであなたの代わりにわずか18か何かではなく、ABR -crf問題と使用でより多くのビットを投げるのと同じビットレートでより高品質を得るために、より遅いかveryslow -preset使用したいです)
ピーターコーデス14

1
ただし、ffmpegに異なるフレームレートを出力させる方法はわかりません。mkvmerge / mp4boxが必要なようですが、ffmpegを取得して生の.264ビットストリームを出力し、h.264デマルチプレクサにfpsオプションを使用しない限り(ビットストリームにはタイミングがないため、-hフルドキュメントがあります)情報、ただ注文。)
ピーター・コーデス14

3

ファイルをMP4として保持するのではなく、スローモーションで再生することが主な目的である場合は、MKVmerge GUIツールを使用して、フレームレートを簡単に変更できるMatroskaコンテナーに再多重化できます。再多重化はメタデータのみを変更し、ストリーム自体は変更しないため、再エンコードよりもはるかに優れています。

最初にパッケージをインストールします

sudo apt-get install mkvtoolnix-gui

次に、MKVmerge GUIを起動します。このようなウィンドウに直面するでしょう

mkvmerge gui 1

[追加]ボタンを押してファイルを選択するか、ファイルを[入力ファイル]領域にドラッグアンドドロップするだけです。この時点で、ビデオのビデオストリームを選択できるはずです。他のストリームも削除できます。何とか邪魔になるからです。

選択すると、下のタブがアクティブになります。

ここに画像の説明を入力してください

「特定のアクションのフォーマット」に変更します

ここに画像の説明を入力してください

1秒あたりのフレームの値を入力できるフィールド「FPS」があることがわかります。速度を4倍遅くすることを計画しているように見えたので、1秒あたり約7フレームが目標です。「ストレッチ」オプションを使用することもできます。

その後、出力ファイルの名前を変更するだけで(必要な場合)、「Start muxing」を押すことができます。

プログラムが実行され、ファイルがあるはずです。


2

また、120 FPSのムービーを30 FPSにロスレスでスローダウンしたかったのです。サウンドテンポを変更し、MP4コンテナーで直接FPSを変更することでそれを行うスクリプトを作成しました。次のツールが必要です。

  1. オーディオストリームを変換するavconv
  2. オーディオテンポを遅くするsondstretch
  3. GPAC取得するMP4Boxは FPSを変更します

変換に使用されるスクリプトは次のとおりです。

#!/bin/bash
#########################################
# Lossless slow down from 120 to 30 FPS #
#                                       #
# Use:                                  #
#                                       #
#   slow.bash <mp4_file>                #
#                                       #
#                           #-= OSi =-# #
#########################################


# Prepare basic variables
IN_FILE="$1"
NAME=$(echo "${IN_FILE}" | sed 's/\.[^.]*//')


# Clean up before start
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264" "${NAME}_slow.mp4"


# Slow down sound
avconv -i "${IN_FILE}" -vn -acodec pcm_s16le "${NAME}_.wav"
soundstretch "${NAME}_.wav" "${NAME}.wav" -tempo=-75
avconv -i "${NAME}.wav" -vn -codec:a ac3_fixed -b:a 448k "${NAME}.ac3"


# Change video frame rate and multiplex with slowed sound
MP4Box -add "${IN_FILE}#video" -raw 1 -new "${NAME}"
MP4Box -add "${NAME}_track1.h264:fps=30" -add "${NAME}.ac3" -new "${NAME}_slow.mp4"


# Clean up when we are done
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264"

このスクリプトは、_slow後置記号付きのMP4のコピーを作成します。

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