web-dev-qa-db-ja.com

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

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

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

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

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

14
EboMike

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パッケージの一部なので、インストールされていることを確認してください。

15
Mitch

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

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

6
thom

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

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

Sudo apt-get install mkvtoolnix-gui

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

mkvmerge gui 1

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

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

enter image description here

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

enter image description here

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

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

プログラムが実行され、ファイルが必要です。

3
v010dya

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

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

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

#!/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のコピーを作成します。

2
OSi