Qtオーディオおよびビデオ開発21全般的なハードデコード

I.はじめに

ハードウェアデコードは、GPUリソ​​ースを使用してビデオストリームをデコードするためにグラフィックチップメーカーによって提案されたスキームです。逆はソフトデコードで、CPUを使用してデコード作業を行う従来のスキームです。利点は、高効率、低消費電力、低熱消費電力です。 、欠点は、強力なサポート(フィルター、字幕などを含む)の欠如、大きな制限(ハードウェアデコードをオンにした後のPCの省エネ機能障害cnqなど)、および設定がより複雑になることです;ハードウェアデコードモジュールと関連ドライバーの調整、適切な再生ソフトウェア、および再生ソフトウェアの正しい設定、ハードウェアデコード機能はそれなしではオンにできません。主流のハードウェアデコードソリューションは、Intel、AMD-ATI、およびNvdiaによって導入されました。

現在、主流のプレーヤーはすべてハードデコードをサポートしています。ハードデコードを行わないプレーヤーは不正です。2K4Kまたは8K HDビデオがますます多くなっています。ハードデコードがなく、ソフトデコードしかない場合、CPUリソースを大量に消費するため、許容できません。描画とデコードのために特別にGPUに渡す必要があります。これにより、CPUの負荷が大幅に軽減され、CPUが他のタスクを実行できるようになります。以前に書いたビデオ監視システムでは、優れたデコードとGPU描画を使用し、これら2つは使用しませんでしたすべてが空っぽの話です。64チャンネルのリアルタイム表示にはまったく耐えられません。VLC、ffmpeg、mpvは確実にハードデコードをサポートしています。vlcとmpvの設定は最も単純です。HaikangのSDKは、デフォルトではハードデコードを提供しません。マニュアルにはハードデコードのライブラリが記述されています。入手するには、お問い合わせいただく必要があります。

異なるコアのハードデコード処理

  1. Vlcハードデコード:
    1.1 libvlc_media_add_optionを呼び出してパラメーターを設定:avcodec-hw = auto
    1.2サポートされるパラメーター:なしauto any d3d11va dxva2

  2. ffmpegハードデコード:
    2.1 av_hwdevice_find_type_by_nameを呼び出して、名前に基づいてハードデコードを自動的に見つけます
    2.2 find_fmt_by_hw_typeを呼び出して、対応するハードデコードフォーマットを見つけます
    2.3コールバックvideoCtx-> get_format = get_hw_formatデコーダーフォーマットがハードデコードに割り当てられます
    2.4
    av_hwdevicex
    2.6 av_hwframe_transfer_dataを呼び出してハードデコードされたデータを変換する
    2.7サポートされるパラメーター:なしqsv cuvid d3d11va dxva2

  3. mpvハードデコーディング:
    3.1 mpv_set_optionを呼び出してパラメーターhwdecを設定します
    3.2サポートされているパラメーター:なしauto any d3d11va dxva2

2.機能

  1. 1 + 4 + 6 + 8 + 9 + 13 + 16 + 25 + 36 + 64画面切り替えを含む、マルチ画面切り替え、全画面切り替えなどをサポートします。
  2. alt + Enter全画面をサポートし、escは全画面を終了します。
  3. カスタム情報ボックス+エラーボックス+問い合わせボックス+右下隅のプロンプトボックス(複数のフォーマットを含む)。
  4. 17セットのスキンスタイルは自由に変更でき、メニューを含め、すべてのスタイルが統一されています。
  5. ジンバルダッシュボード上でマウスを動かしてハイライトすると、8つの方向が正確に識別されます。
  6. 下部の画面のツールバー(画面分割スイッチ+スクリーンショットサウンドおよびその他の設定)が上に移動して強調表示されます。
  7. ロゴ+中国語のソフトウェア名+英語のソフトウェア名は、構成ファイルで変更できます。
  8. Baiduマップ、ビューの切り替え、モーショントラック、デバイスの位置、および緯度と経度を取得するためのマウスクリックなどをカプセル化します。
  9. 画像マップをサポートし、デバイスボタンを画像マップ上で自由にドラッグして、位置情報を自動的に保存できます。
  10. Baiduマップと画像マップで、ビデオをダブルクリックしてカメラのリアルタイムビデオをプレビューします。
  11. スタックウィンドウ。各ウィンドウは個別のqwidgetであり、独自のコードを記述するのに便利です。
  12. 上部マウスの右クリックメニューは、時間の表示と非表示を動的に制御でき、CPU +左上パネル+左下パネル+右上パネル+右下パネルで、デフォルトレイアウトの復元をサポートします。
  13. ツールバーには、複数の小さなアイコンと閉じるアイコンを配置できます。
  14. 左側と右側はドラッグして引き伸ばすことができ、幅と高さの位置は自動的に記憶され、再起動後に復元されます。
  15. カメラノードをダブルクリックすると、ビデオが自動的に再生され、ノードをダブルクリックすると、ビデオが順番に自動的に追加され、次のノードに自動的にスキップされます。親ノードをダブルクリックすると、ノードの下にあるすべてのビデオが自動的に追加されます。
  16. カメラノードを対応するウィンドウにドラッグしてビデオを再生します。ローカルファイルは直接再生用にサポートされています。
  17. ビデオフレームはドラッグとスワッピングをサポートし、即座に応答します。
  18. ノードをダブルクリックしてノードをドラッグし、フォームをドラッグして位置を入れ替えると、url.txtが自動的に更新されます。
  19. url.txtからのチャンネル動画再生の読み込みをサポートし、最後のチャンネルに対応する動画を自動的に記憶し、ソフトウェアの起動後に自動的に開いて再生します。
  20. 右下隅の音量バーコントロールは、フォーカスが失われると自動的に非表示になり、音量バーにはミュートアイコンが表示されます。
  21. Baiduオンラインマップとオフラインマップを統合し、デバイスの対応する場所を追加したり、マップを自動的に生成したり、ズームをサポートしたり、オーバーレイを追加したりできます。
  22. ビデオをチャンネルウィンドウの外にドラッグすると、ビデオが自動的に削除されます。
  23. マウスの右ボタンで、現在の+すべてのビデオを削除できます。
  24. レコーダー管理、カメラ管理、印刷情報を追加、削除、変更、インポート、エクスポートし、再起動せずにすぐに新しいデバイス情報を適用してツリーリストを生成できます。
  25. マップをproファイルにロードするかどうかを自由に有効にすることができます。
  26. ビデオ再生用に2種類のカーネルを自由に切り替えることができます。vlc+ ffmpeg、どちらもプロで設定できます。
  27. 1 + 4 + 9 + 16画面ポーリングを設定でき、ポーリング間隔とポーリングストリームタイプを設定できます。メインインターフェイスの下部にあるツールバーの右側にある[ポーリングの開始]ボタンをクリックし、もう一度クリックしてポーリングを停止します。
  28. デフォルトでは、マウスポインターは10秒以上操作しないと自動的に非表示になります。
  29. onvif検索機器をサポートし、任意のonvifカメラをサポートします。これには、Haikang Dahuayu Shitiandi Weiye Huaweiなどが含まれますが、これらに限定されません。
  30. onvif PTZコントロールをサポートし、PTZカメラを上下左右に移動できます(リセットとフォーカス調整を含む)。
  31. 同時に、sqlite、mysql、postsqlなどのデータベースもサポートしています。
  32. ビデオを保存でき、タイミングストレージまたは単一ファイルストレージはオプションで、ストレージインターバルはオプションです。
  33. ビデオストリームの通信方法をtcp + udpに設定し、ビデオのデコードを速度優先、品質優先、イコライゼーションなどに設定できます。
  34. ハードデコードタイプの設定、qsv、dxva2、d3d11vaなどのサポートが可能
  35. デフォルトでは、openglを使用してビデオを描画します。これは、CPUリソースの消費量が非常に少なく、yuyvおよびnv12形式の描画をサポートしています。これは非常に優れています。
  36. 高度にカスタマイズ可能で、ユーザーはこれに基づいて独自の機能を簡単に導出でき、LinuxおよびMacシステムをサポートします。

3、レンダリング

ここに画像の説明を挿入

4、関連サイト

  1. 国内サイト:https : //gitee.com/feiyangqingyun/QWidgetDemo
  2. 国際サイト:https : //github.com/feiyangqingyun/QWidgetDemo
  3. 個人ホームページ:https : //blog.csdn.net/feiyangqingyun
  4. Zhihuホームページ:https ://www.zhihu.com/people/feiyangqingyun/
  5. エクスペリエンスアドレス:https : //blog.csdn.net/feiyangqingyun/article/details/97565652

5、コアコード

bool FFmpegThread::initHWDeviceOther()
{
#ifdef hardwarespeed
    //根据名称自动寻找硬解码
    QByteArray hardwareData = hardware.toUtf8();
    enum AVHWDeviceType type = av_hwdevice_find_type_by_name(hardwareData.data());
    qDebug() << TIMEMS << "AVHWDeviceType" << type;

    //找到对应的硬解码格式
    hw_pix_fmt = find_fmt_by_hw_type(type);
    if (hw_pix_fmt == -1) {
        qDebug() << TIMEMS << "cannot support hardware";
        return false;
    }

    AVStream *videoStream = formatCtx->streams[videoStreamIndex];
    videoCtx = avcodec_alloc_context3(videoCodec);
    if (!videoCtx) {
        qDebug() << TIMEMS << "avcodec_alloc_context3 error";
        return false;
    }

    int result = -1;
    result = avcodec_parameters_to_context(videoCtx, videoStream->codecpar);
    if (result < 0) {
        qDebug() << TIMEMS << "avcodec_parameters_to_context error";
        return false;
    }

    //解码器格式赋值为硬解码
    videoCtx->get_format = get_hw_format;
    //av_opt_set_int(videoCtx, "refcounted_frames", 1, 0);

    //创建硬解码设备
    AVBufferRef *hw_device_ref;
    result = av_hwdevice_ctx_create(&hw_device_ref, type, NULL, NULL, 0);
    if (result < 0) {
        qDebug() << TIMEMS << "open the hardware device error";
        return false;
    }

    videoCtx->hw_device_ctx = av_buffer_ref(hw_device_ref);
    av_buffer_unref(&hw_device_ref);
#endif
    return true;
}

おすすめ

転載: blog.csdn.net/feiyangqingyun/article/details/108321160