H265 ビデオ ハード ソリューション

ハード ソリューションでは、グラフィックス カード GPU、専用 DSP、FPGA、ASIC チップなど、エンコードに CPU 以外を使用します。現在の主流の GPU アクセラレーション プラットフォーム: INTEL、AMD、NVIDIA。

1. ソフトコーディングとハードコーディングの比較

ソフト コーディング: 実装が直接的で簡単、パラメーターの調整が簡単、アップグレードが簡単ですが、CPU 負荷が高く、ハード コーディングよりもパフォーマンスが低く、低ビット レートでの品質は通常ハード コーディングよりも優れています。
ハードコーディング: パフォーマンスが高く、通常は低ビットレートのソフトコーディングよりも品質が低くなりますが、一部の製品は優れたソフトコーディングアルゴリズム(X264など)をGPUハードウェアプラットフォームに移植しており、品質は基本的にソフトコーディングと同等です。コーディング。

2. 現在主流のGPUプラットフォーム開発フレームワーク

CUVID: NVIDIA のクローズド プログラミング フレームワーク。これを通じて GPU コンピューティング リソースを呼び出すことができ、N カード専用です。
AMD APP: AMD が自社 GPU 向けに提案する汎用並列プログラミング フレームワークのセットであり、オープン規格であり、CPU と GPU で OpenCL フレームワークを同時にサポートすることで、演算能力の融合を実現しています。
OpenCL: オープン コンピューティング言語であり、異種プラットフォーム用のプログラムを作成するためのフレームワークです。異種プラットフォームには、CPU、GPU、およびその他のコンピューティング プロセッサが含まれます。目標は、異なるプラットフォーム上で同じ操作でハードウェア アクセラレーションをサポートできるようにすることです。
Inel QuickSync: Intel グラフィックス カードに統合された、コア ディスプレイ専用の専用ビデオ コーデック モジュール。
CUDA は、NVIDIA GPU ハードウェア上でのみ実行できます。しかし、OpenCL の目標は、あらゆる種類の並列プロセッサに対処することであり、OpenCL は、異種システムでの一般的なコンピューティングに適した、真にオープンで無料の著作権プログラミング標準としては初めてのものです。異種プラットフォームは、CPU、GPU、DSP、FPGA、またはその他のタイプのプロセッサーによって構築できます。
DXVA: DXVA は DirectX Video Acceleration の略称で、中国語ではビデオ ハードウェア アクセラレーションと訳されます。DXVA は、Microsoft によって特別にカスタマイズされたビデオ アクセラレーション仕様です。DXVA 1.0 と DXVA 2.0 の 2 つのバージョンがあり、ほぼすべてのグラフィック カードにハードウェア アクセラレーション機能が搭載されています。

3. プロセスの違い

ハードデコードとソフト編集: read(ffmpeg) -> decoder(NVIDIA) -> | Queue -> encoder(ffmpeg) ソフトデコードとソフト編集: read(ffmpeg) -> decoder(ffmpeg) ->encoder(
ffmpeg) デコード
とエンコード間隔中はキューが維持され、キュー長は 20 に設定されます(デコード速度がエンコード速度よりも速いため、データが上書きされ、フレームが失われます)

4. NVIDIA CUVID、Intel QuickSync、DXVA2 のうち、DXVA2 は DXVA2 (コピーバック) と DXVA2 (ネイティブ) に分かれていますが、これらのデコード方式の違いは何ですか?

NVIDIA CUVID は、ハードウェア デインターレースを可能にする NVIDIA 専用のハードウェア デコード インターフェイスです。
Intel QuickSync: Intel 内蔵ディスプレイ専用のハードウェア デコード インターフェイス。CPU 使用率は他のハードウェア デコード モードより約 5 ~ 10% 高く、インターリーブ処理のためにハードウェアをオンにすることができます。
DXVA2 (コピーバック): Microsoft 向けに開発されたハードウェア アクセラレーション インターフェイスです。AMD、NVIDIA、および Intel グラフィック カードをすべて使用できます。デコードされた情報をメモリに返します。複数のリターン アクションにより、パフォーマンスが低下します。ネイティブ若干劣りますが、デコーダとレンダラの間にフィルタを追加できるという利点があります。
DXVA2 (ネイティブ): Microsoft 向けに開発されたハードウェア アクセラレーション インターフェイスです。AMD、NVIDIA、および Intel グラフィックス カードも使用できます。デコードされた情報はメモリに送信されず、直接レンダリングされるため、パフォーマンスが優れていますcopy-back の欠点は、制限がより厳しいことです。
したがって、デコード方法としては、DXVA2 (ネイティブ) > DXVA2 (コピーバック) > NVIDIA CUVID または Intel QuickSync をお勧めします。

5. NVIDIA ハードウェア コーデック ソリューション

1. SDK のコーデック インターフェイスを使用する

Nvidia はビデオ コーデック用に 2 つの関連 SDK を提供しています
。 NVENC -- ハードウェア エンコードを担当します。
NVCUVID -- ハードウェア デコードを担当します
。 NVENC は別個の SDK で、最新のグラフィック カード ドライバに統合されています。最新のドライバ ドキュメントをインストールすると、関連するライブラリを見つけることができます。Ubuntu 14.04 では、関連するライブラリ ファイルは /usr/lib/nvidia-352/ ディレクトリにあります。
NVCUVID は、最新の CUDA ツールキットに含まれる CUDA コンポーネントです。ただし、ライブラリ ファイル libnvcuvid.so はグラフィックス カードのクラス ライブラリにあります。以前のバージョンのグラフィックス カード ドライバーには、NVCUVID に対応する NVCUVENC というハードウェア エンコーダーもありましたが、このコンポーネントは NVENC に置き換えられました。

2. エンコーダを使用して OpenCL と SDK をパッケージ化する

この方法は私が個人的に考える最も理想的な方法ですが、現在FFMPEGにはNvidia社のNVENCのパッケージであるエンコーダnvencがあり、それを利用することでFFMPEGとシームレスに統合することができます。さらに、Intel QSV 用のパッケージも含まれています。AMD の関連インターフェイスには、これまでのところ関連情報が見つかりません。
ただし、FFMPEG には NVENC のインターフェイスしかなく、NVCUVID のカプセル化はありません。関連するデコーダを実装する必要がある場合は、FFMPEG インターフェイスを自分で実装する必要がある場合があります。
libx264 には OpenCL 用のパッケージがありますが、Windows でこの機能を試したところ成功しませんでした。
オープン ソースのフォーマット コンバータである HandBrake にも、Intel QuickSync 用のラッパー、OpenCL を使用した画像ストレッチ、x264 を使用した opencl ラッパーが含まれています。このプロジェクトの欠点は、ドキュメントがあまり豊富ではなく、研究するのが難しいことです。

FFMPEG で nvenc エンコーダを使用するには、コンパイル オプションにenable-nvenc オプションを追加する必要があります (古いバージョン、新しいバージョンが自動的に検出され、disable-nvenc のオプションが表示されます)。
このオプションは、nvEncodeAPI.h ヘッダー ファイルに依存します。このヘッダー ファイルはプライベート ドライバーには含まれていません。NVIDIA VIDEO CODEC SDK から SDK をダウンロードする必要があります。解凍後、このヘッダー ファイルは Samples/common/inc にあります。ディレクトリにある場合は、リンクできるディレクトリにコピーします。その後、コンパイルはスムーズに完了し、nvenc エンコーダを含むライブラリを取得できます。

6. ffmpeg はビデオをハード デコードして描画しますが、それでも CPU が大量に消費されます。

CPU 使用率が高くなるのは、主に av_hwframe_transfer_data(sw_frame, Frame, 0) が CPU を占有するためです。この関数は使用しないでください。ハード レンダリングには d3d+dxva2 または cuda+opengl を使用する必要があります。
OpenCL は主に汎用並列コンピューティングに使用され、事前定義されたデータ構造とコードに基づいており、GPU がビデオ処理、財務モデリング、科学技術コンピューティング、画像処理などのさまざまな汎用コンピューティング タスクを処理できるようになります。最新の GPU を最大限に活用し、並列スケーラビリティを実現します。OpenCL は、CPU、GPU、FPGA などの複数のハードウェア プラットフォーム上で実行でき、OpenGL、Direct3D、その他の API とは何の関係もないため、さまざまなグラフィックス API と対話できます。
OpenGL はコンピュータ グラフィックスの処理とレンダリングに重点を置いていますが、広範なサポートと幅広い用途を備えた強力なレンダリング パイプラインを提供します。ゲームや仮想現実アプリケーションでは、OpenGL がリアルタイム グラフィックス レンダリングの標準 API として使用されます。ただし、OpenGL は汎用コンピューティング タスクを実行できないため、OpenCL や CUDA などの他の API を使用する必要があります。
av_hwframe_transfer_data GPU データから CPU データへ
dxva2_retrieve_data_call データの取得とレンダリングを同時に行う

7、共通コマンド

1. ffmpeg コマンドを使用して、サポートされているハードウェア デコーダを一覧表示する方法:

ffmpeg -hwaccels


2. ffmpeg ハード ソリューション コマンド:

ffmpeg -i d:\input.mp4 -vcodec libx264  d:\output.mp4


ffmpeg トランスコーディング中に出力されるフレーム、fps、q、サイズ、ビットレート、速度の意味。
Frame はビデオの現在のフレームを示します。fps は 1 秒間にエンコードされるビデオ フレームの数を示します。q はエンコード品質を示します。size はファイルに書き込まれるデータ サイズを示します。bitrate はビット レートを示します (単位は kbits/s 1000 ビット) /秒); time は現在の処理ファイルの場所の継続時間を示し、speed はエンコード速度 (ビデオ フレームの秒数/ffmpeg の処理時間の秒数) を示します。
速度に応じて、ffmpeg の処理にかかる時間を計算できます。ffmpeg によるビデオ ファイルの処理が完了するまでの時間は、ビデオ再生時間 (秒) / 速度 (速度) です。

ffmpeg version 4.4-full_build-www.gyan.dev Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 10.2.0 (Rev6, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libglslang --enable-vulkan --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, mpeg, from 'd:\input.mp4':
  Duration: 03:37:39.62, start: 37915.032111, bitrate: 354 kb/s
  Stream #0:0[0x1e0]: Video: hevc (Main), yuvj420p(pc, bt709), 960x576, 50 fps, 25 tbr, 90k tbn, 50 tbc
  Stream #0:1[0x1c0]: Audio: pcm_mulaw, 8000 Hz, mono, s16, 64 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (hevc (hevc_cuvid) -> h264 (h264_nvenc))
Press [q] to stop, [?] for help
Output #0, mp4, to 'd:\ch01_202203302130002-hw3.mp4':
  Metadata:
    encoder         : Lavf58.76.100
  Stream #0:0: Video: h264 (Main) (avc1 / 0x31637661), nv12(pc, bt709, progressive), 960x576 [SAR 1:1 DAR 5:3], q=2-31, 4000 kb/s, 25 fps, 12800 tbn
    Metadata:
      encoder         : Lavc58.134.100 h264_nvenc
    Side data:
      cpb: bitrate max/min/avg: 0/0/4000000 buffer size: 8000000 vbv_delay: N/A
frame=200781 fps=728 q=9.0 size= 3945472kB time=02:13:51.12 bitrate=4024.5kbits/s dup=0 drop=5 speed=29.1x

3. nvidia グラフィックス カードの nvidia-smi コマンド
3.1 を表示して、GPU の現在のステータスを表示します。

nvidia-smi

パラメータの詳細な説明:
**GPU: **このマシンの GPU 番号 (複数のグラフィックス カードがある場合、番号は 0 から始まります) 写真上の GPU 番号は: 0 **
ファン: **ファン速度 (0%- 100% )、N/A はファンがないことを意味します。この速度はコンピュータが予期するファン速度です。実際には、ファンがブロックされている場合、表示された速度に達しない可能性があります。
**名前: **GPU タイプ、写真の GPU の種類: GeForce MX250/RTX 2080Ti
**温度: **GPU 温度 (GPU 温度が高すぎると GPU 周波数が低下します)
**パフォーマンス: ** GPU のパフォーマンス ステータス、P0 (最大パフォーマンス) から P12 (最小パフォーマンス) までの数値は次のとおりです: P0
**Persistence-M: **永続モードのステータス。永続モードは多くのエネルギーを消費しますが、コストがかかります。新しい GPU アプリケーションが開始されると大量のエネルギーが発生します 時間が短くなると、図は次のようになります: オフ
**Pwr: User/Cap: **エネルギー消費表示、Usage: 使用量、総キャップ量
**Bus-Id : **GPU バス関連のディスプレイ、ドメイン: バス: device.function
**Disp.A: **Display Active、GPU ディスプレイが初期化されているかどうかを示します
**Memory-Usage: **ビデオ メモリの使用量
**Volatile GPU-Util : **GPU 使用率
**Uncorr. ECC : **ECC について、エラーチェックおよび修正テクノロジを有効にするかどうか、0/無効、1/有効
**Compute M: **Compute モード、0/DEFAULT、1/EXCLUSIVE_PROCESS、 2/禁止
**プロセス: **ビデオ メモリの使用量、プロセス番号、各プロセスが占有している GPU を表示します。
**タイプ: **プロセス タイプ。C はコンピューティング プロセスを意味し、G はグラフィックス プロセスを意味し、C+G は両方を意味します。
3.2 数秒ごとにメモリのステータスを更新します。

nvidia-smi -l 秒数

3.3 監視結果をファイルに書き込み、ファイルに書き込む監視フィールドを指定します。

nvidia-smi -l 1 --format=csv --filename=report.csv --query-gpu=timestamp,name,index,utilization.gpu,memory.total,memory.used,power.draw

参考文献:
https://tool.4xseo.com/a/169.html
https://www.cnblogs.com/huty/p/8517141.html
https://blog.csdn.net/qq_40594137/article/details / 124959608
https://deepinout.com/opencl/opencl-tutorials/22_difference_between_opencl_and_opengl.html

おすすめ

転載: blog.csdn.net/byxdaz/article/details/132699279