ビデオを圧縮する方法 - ffmpeg

プライマー

ビデオの圧縮には主に ffmpeg が使用されます。なぜビデオを圧縮する必要があるのか​​を明確に考える必要があります。ユーザー エクスペリエンス (開くまでの秒数、スムーズさ) の問題が原因でしょうか? それともコスト (帯域幅、ストレージ) が原因でしょうか? それとも運用上の(広告、インタラクティブ)ニーズのためでしょうか?圧縮する前に主要な目標を固定し、トレードオフのバランスをとる必要があります。

バックグラウンド

私が最初に受けた要望は、ユーザーの再生が停止するというもので、これを解決する必要がありました。ffmpeg を使用すると、ビデオ ソースを簡単に分析できます。基本情報には、解像度、フレーム レート、ビット レートなどの主要なデータが含まれます。参照情報には、ファイル形式、エンコード形式、ピクセル形式などが含まれます。(音声はファイルサイズが小さいため、優先順位が最初です)

解像度は 1080x1928、フレーム レートは 30fps、コード レートは 13095kbps、ファイルは mp4、エンコード形式は h264 (main)、ピクセル形式は yuv420p、ファイル長は 00:01 であることがわかります。 :10.1、1分10秒; このコードを押してください レート、ビデオ部分のサイズは13095x70=916650kb、ここにビットがあります、変換されたKBは114581.25、変換されたMBは約111.90MBです。

ユーザーのネットワークの要件を簡単に評価してみましょう。バッファが 500 ミリ秒の場合、13095x0.5=6547.5kb=818.4375KB=約 0.8MB のダウンロード速度は、依然として比較的厳しいものです。これは、ネットワーク オペレータが kbps が小さいと全員に報告しているためです。 b、変換は 6.4Mb を必要とするのと同等です。

解決

上記の問題を考慮して、私の解決策は次のとおりです:
1. 一般的に携帯電話プレーヤーにはそれほど高い解像度は必要ないので、720p を下げる;
2. 30fps のフレーム レートも適切に下げることができ、 22-25 に削減;
3. ビット レート圧縮、-crf 固定ビット レート比圧縮または -b:v 最高ビット レート圧縮方法を選択できます;
4. ビデオ エンコーディング h264 (メイン) は h264 (高) に調整できます。
上記の 4 つのパラメータ設定圧縮コマンドは次のとおりです。
ffmpeg -y -i xx.mp4 -c:a copy -c:v libx264 -profile:v high -r 30 -crf 30 -s 720x1080 xx-out.mp4
パラメータを簡単に紹介します。
-y: 出力ファイルが上書きされることを示します。
-i: 入力ファイルが示され
ます。 -c:a: オーディオ部分がエンコードされていることを示し、copy は、新しいファイルに直接コピーされます
-c:v: ビデオ部分がエンコードされていることを示し、libx264 は
エンコードに h264 が使用されることを示します -profile:v: h264 エンコード パラメータ、よりコンパクトな圧縮アルゴリズムを使用します
-r: ビデオを示しますフレーム レート、30fps
-crf: コード レートが 0 ~ 500 の固定コード レート比を適用することを示します。コード レートが大きいほど、コード レートは低くなります。一般的には 18 ~ 32 が適切です。 -s: ビデオ解像度クロッピング、
720x1080 720pにクロップすることを意味します

効果

上記のコマンドを実行すると、次のような効果が得られます。

最も明らかなビット レートは 926kbps に低下し、その他はパラメータに応じて変更され、新しいファイル サイズは 926x70=64820kb、約 7.91MB に最適化されます。111.90MB から 7.91MB へ、最適化効果は非常に優れています。ユーザーのネットワーク帯域幅の要件は約 463kb に減少しますが、これは 6.4Mb と比較するとほんの一部です。

それは数秒で達成できるでしょうか?戻って moov ヘッダーを見てみましょう。

ftyp と free はファイル識別子であることがわかりますので、気にする必要はありません。mdat はビデオ + オーディオ データ ストレージで、8030053 バイトを占め、次が moov ヘッダーです。ビデオの再生では最初に moov が取得されることがわかります。特定のメタデータ情報、エンコード方法、解像度ジオメトリなどを知る前にヘッダーを確認してください。一般に、ビデオ プレーヤーも最適化され、最初にビデオ ヘッダーの前にある特定のバイト数を読み取ります。moov ヘッダーが解析されていない場合は、ビデオ ヘッダーから特定のバイト数を読み取るための新しいリクエストが作成されます。 moov の解析を補うためにファイルの末尾を追加します。理想的な状態は、切断して再要求し、moov ヘッダーを解析してからバッファリングされたデータを要求するのではなく、最初に moov ヘッダーを解析してデータをバッファリングし、引き続きデータをバッファリングできることです。したがって、moov ヘッドに向けて前進する必要があります。
具体的な ffmpeg コマンドは次のとおりです。
-movflags +faststart
上記のパラメータを上記のコマンドに追加するだけです。最終的なコマンドは次のとおりです。
ffmpeg -y -i xx.mp4 -c:a copy -c:v libx264 -profile:v high -r 30 -crf 30 -s 720x1080 -movflags +faststart xx-out.mp4

拡大

ここではまず基本的なビデオの最適化について紹介します。上記は最も基本的な最適化であり、上記に基づいて他の最適化を進めていきます。
1. エンコード形式を変更し、h265 (Apple qt と互換性)、vp9、av1 を試してください;
2. ビデオ スライス、hls+ts の m3u8 ファイル形式を使用してください;
3. 2 パスを適用してビット レートを最適化します;
4最も重要な導入 ビデオ品質評価システム、ssim、psnr、vmaf;
5. マルチ解像度配信を試す、480p、720p、1080p;
6. ネットワークの最適化、CDN アクセラレーション;
7. その他の小さな最適化;
実際の実践プロセスでは、それでも常にアプリケーションを調整し、問題に遭遇し、問題を解決する必要があります。最適化ターゲットを選択し、品質比較パラメータを選択し、最終的な最適化バランスを達成するために上記のパラメータを継続的に調整します。

この記事の利点、無料の C++ オーディオおよびビデオ学習教材パッケージ、技術ビデオ/コード (オーディオおよびビデオ開発、インタビューの質問、FFmpeg、webRTC、rtmp、hls、rtsp、ffplay、コーデック、プッシュプル ストリーム、srs を含む) )↓↓↓ ↓↓↓下記からどうぞ↓↓無料で読むには記事下部をクリック↓↓

おすすめ

転載: blog.csdn.net/m0_60259116/article/details/131014408