MP4ビデオのフレームレートを変更しようとしています(120fpsのGoProビデオです。スローモーション効果のために30fpsで再生したいです)。
これにはavconvを使用しています:
avconv -i SourceMovie.mp4 -vf setpts=4.0*PTS -r 30 DestMovie.mp4
技術的には機能しますが、映画を再エンコードします。遅いことに加えて、明らかに品質の問題です。技術的には、ビデオのヘッダーにfpsを設定する方法が必要ですが、どうすれば変更できますか? (avconv以外のツールも動作します。)
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
パッケージの一部なので、インストールされていることを確認してください。
ビデオ(コンテナ)のヘッダーのフレームレートを変更しても、ビデオストリーム(またはオーディオストリーム)自体には影響しません。再エンコードが唯一のオプションです。
ビデオストリームにはタイムスタンプがあり、ほとんどのビデオでは、フレームはフレーム間圧縮のために相互に依存しています。一部のプレーヤーは、ビデオの速度を上げたり下げたりできますが、埋め込みコマンドなどではできません。 containercommandが変更を要求した場合、プレーヤーはその場でフレームレートを変更できません。ビデオファイルは最終的に仕様から外れます(つまり、標準に準拠していない)ため、99.9%のプレーヤーがそれに従うことを拒否します。コーディングし直さずに必要なことを行うことはまったく不可能です。もちろん、編集の最後のステップまで再コーディングを待つことができます。
ファイルをMP4として保持するのではなく、スローモーションで再生することが主な目的の場合は、MKVmerge GUIツールを使用して、フレームレートを簡単に変更できるMatroskaコンテナーに再多重化できます。再多重化はメタデータのみを変更し、ストリーム自体は変更しないため、再エンコードよりもはるかに優れています。
最初にパッケージをインストールします
Sudo apt-get install mkvtoolnix-gui
次に、MKVmerge GUIを起動します。このようなウィンドウに直面するでしょう
[追加]ボタンを押してファイルを選択するか、ファイルを[入力ファイル]領域にドラッグアンドドロップするだけです。この時点で、ビデオのビデオストリームを選択できるはずです。また、他のストリームは削除することもできます。それらはとにかく邪魔になるからです。
選択すると、下のタブがアクティブになります。
「特定のアクションのフォーマット」に変更します
1秒あたりのフレームの値を入力できるフィールド「FPS」があることがわかります。速度を4倍遅くすることを計画しているように見えたので、1秒あたり約7フレームが目標です。 「ストレッチ」オプションを使用することもできます。
その後、出力ファイルの名前を変更し(必要な場合)、「Start muxing」を押すだけです。
プログラムが実行され、ファイルが必要です。
また、120 FPSの映画をロスレスで30 FPSにスローダウンしたかったのです。サウンドテンポを変更し、MP4コンテナーで直接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のコピーを作成します。