ffmpeg-既存のメディアファイルからエンコード設定をコピーまたは抽出する方法


19

私はこれを複数回できるようになりましたので、お願いします。

既存のビデオファイルまたはオーディオファイルがあるffmpeg場合mplayer、他のメディアプレーヤーは、コンテナ、コーデック、使用されるビットレート、おそらくさまざまな品質やエンコード固有の設定などの「プロパティ」の少なくとも一部を検出できます。

これらの設定を既存のファイルから抽出して、ffmpegでのエンコードに(直接)使用するにはどうすればよいですか?

たとえば、いくつかの設定でmkvエンコードされたビデオx264と、別の非圧縮aviファイルがありました。x264 mkvファイルで使用されているエンコード設定を「コピー」して、同じ設定でaviをトランスコードしたいと思います。

注:設定をデコーダーからエンコーダーに「変換」する人間の作業を含まない方法を探しています。最初に設定を抽出してどこかに保存する必要がある場合でも構いませんが、読み取りオプションをコマンドラインまたはffmpegのプリセット|構成ファイルに単純に入力できるようにしたいと思います。


おそらく、ffprobe(特に-show_streamsand -show_formatオプションを使用して)出力をソートし、その情報を使用して重要なものをスクリプト化できます
-evilsoup

1
多くの場合、ビットレートなどの同じ設定を使用すると(正確なビットレートをコピーしようとすることはユーザーの間で人気があるようです)、最適な品質にはなりません。もちろん、典型的な入力がどのようなものかはわかりませんが、x264では-crf一般的にこのオプションの使用をお勧めします。FFmpeg and x264 Encoding Guideを参照してください。
-llogan

ffprobeの出力にエンコード設定に関する情報が見つかりません:(
thelolcat

それだけでReFramesの数を示しているが、MediaInfoをのような他の設定はしない
thelolcat

ffmpegを使用した入力構文は、メタデータフィールドとは異なります。たとえばchannels:6、ビデオファイルから読み取ることができますが、エンコードするにはスイッチを使用する必要があります-ch:6。一部のスイッチは、など1つの文字、いくつかの使用2、使用
jiggunjer

回答:


10

それを行う自動方法はありません。元のファイルのパラメーターを見て、出力ファイルに適用する必要があります。

ほとんどの場合、これらは次のようになります。

  • コンテナ形式(MP4、MKVなど)
  • ビデオおよびオーディオコーデック(H.264、H.265、…)
  • オーディオ固有:
    • オーディオチャンネルの数
    • オーディオサンプリングレート
    • 音声ビットレート
  • ビデオ固有:
    • プロファイルとレベル(互換性を確保するには、こちらを参照)
    • 最大ビットレート制限(例:H.264
    • 最大ビデオ解像度、-filter:v scaleまたはを介した変更-s:v
    • フレームレート、変更方法 -filter:v fps -r
    • クロマのサブサンプリング、変更-pix_fmt(たとえば、-pix_fmt yuv420p最高の互換性を提供する必要があります)
    • GOPサイズ(IDRフレーム間の距離)、経由で設定 -g
    • その他の特定のエンコード設定

しかし、それで十分だとしても、デバイスによっては、ビットストリームに埋め込まれた特定の専有情報が必要になる場合があります。


を使用する特定のタスクに関してはx264、これは簡単なことではありません。これらのタスクを処理する単一のスクリプトを認識していません。通常、これらのタスクは手動で行われます。Unix / LinuxまたはOS Xのエンコード設定に関するほとんどの情報についてはmediainfo、いくつかのBashトリックを使用できます。

たとえば、MP4ファイルのx264でエンコードされたビデオの場合:

mediainfo input.mp4 | grep "Encoding settings" | cut -d':' -f2- | tr '/' '\n' | sed 's/ //'

これにより、x264オプションのリストが出力されます。

cabac=1
ref=3
deblock=1:-1:-1
analyse=0x3:0x113
me=hex
subme=7
psy=1
…

これらのオプションを手動でx264バイナリに渡すことができます。

FFmpegを使用する場合、x264のすべてのオプションをこのようにマッピングできるわけではないため、少し複雑です。しばしば単純なプリセット、同調プロファイル仕様は同様に行うことに注意してください(に見られるようにx264 --fullhelpし、x264のコードガイド)、およびCRFレベルを指定することは十分です。

そして、これはオーディオを考慮していません。幸いなことに、それほど多くのオプションはありません。


それでは、ffprobeやffmpegでは不可能ですか?
thelolcat

いいえ、ffprobe / ffmpegで直接行うことはできません。x264でエンコードされたビデオの場合、mediainfo出力を使用し、これらのオプションをffmpegにマッピングします-x264-params。(x264エンコーディングガイドも参照してください)。しかし、あらゆる種類のコーデック/エンコーダーまたはコンテナ形式の一般的なソリューションが必要な場合は、変換を行う中程度に洗練されたスクリプトを作成する必要があります。
slhck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.