web-dev-qa-db-ja.com

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

私はこれを複数回できるようになりたかったので尋ねます。

既存のビデオまたはオーディオファイルがある場合、ffmpegmplayerおよび他のメディアプレーヤーは、使用されているコンテナ、コーデック、ビットレートなどの「プロパティ」の少なくとも一部を検出できます。特定の設定など.

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

たとえば、いくつかの設定でx264でエンコードされたmkvビデオと、別の非圧縮aviファイルを取得しました。 x-264 mkvファイルで使用されているエンコーディング設定を「コピー」して、aviをsame設定でトランスコードします。

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

19
n611x007

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

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

  • コンテナ形式(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では、いくつかのBashトリックで mediainfo を使用できます。

たとえば、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レベルを指定するだけで十分です。

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

11
slhck