I.はじめに
このビデオ再生コンポーネントは 6 年以上継続的に書かれており、継続的に更新され、反復されています。ビデオ監視業界におけるクライアント ソフトウェア開発の主な要件は、ストリーミング表示です。たとえば、rtsp ビデオ ストリーム アドレスが与えられた場合、次のことが必要です。ソフトウェア上でリアルタイム画像を表示する、2 つ目はビデオの保存、3 つ目は OSD の貼り付けや画像解析などの周辺処理です。表示用にストリームを取得することが最初のステップです。クロスプラットフォーム要件がある場合は、ffmpeg を使用して実装することを個人的にお勧めします。結局のところ、ffmpeg は非常に低レベルであり、その過程でオーディオとビデオについて多くのことを学ぶことができます. 難点は、難しくて自分で大量に使う必要があることですが、コードはffmpeg独自の仕様に従って処理されます。オーディオとビデオの基盤がなく、ストリーミング表示を短時間で完了したい場合は、vlc/mpv/mdk を選択することをお勧めします。これら 3 つの最下層はほぼ ffmpeg に関連していますが、より優れています。基本的には、わずか数行のコードで実現できます。
ビデオ再生コンポーネント自体は、qmedia/ffmpeg/vlc/mpv/mdk/Haikang sdk/easyplayer などのさまざまなコアを統合しています。構築に 1 年以上かかった再生コンポーネント フレームワークを通じて、二重継承メカニズムを実現できます。非常に便利です。新しいコアを追加することで、このコンポーネントは非常に柔軟で柔軟になり、下位からデコード スレッドを共有する機能だけでなく、非常に低い CPU 使用率でマルチスクリーン レンダリングを処理する機能も備えています。同時に、コアが動的に切り替えられるため、監視システムはビデオ ストリームごとに異なる解析コアを指定できます。たとえば、一般的なアドレスは ffmpeg を使用してデコードでき、Hikvision 機器は Hikvision SDK でデコードでき、Dahua 機器はSDK デコード後、Android では mdk デコードに切り替えることができます (ハード デコード内蔵/非常に強力なパフォーマンス)。
2.エフェクト描画
3. 体験アドレス
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
- 個人の作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
- エクスペリエンス アドレス:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 抽出コード: 01jf ファイル名: bin_video_demo。
4. 機能的特徴
4.1. 基本機能
- mp3、wav、mp4、asf、rm、rmvb、mkv など、さまざまなオーディオおよびビデオ ファイル形式をサポートします。
- ローカル カメラ デバイスとローカル デスクトップ コレクションをサポートし、複数のデバイスと複数の画面をサポートします。
- rtp、rtsp、rtmp、http、udp などのさまざまなビデオ ストリーミング形式をサポートします。
- ローカルのオーディオ ファイルとビデオ ファイル、およびネットワーク オーディオ ファイルとビデオ ファイルは、ファイルの長さ、再生の進行状況、音量、ミュート ステータスなどを自動的に識別できます。
- ファイルでは再生位置の指定、音量調整、ミュート状態などの設定が可能です。
- ファイルの倍速再生をサポートしており、オプションで 0.5x、1.0x、2.5x、5.0x などの速度を選択できます。これはスロー再生と高速再生に相当します。
- 再生の開始、停止、一時停止、継続をサポートします。
- スクリーンショットのキャプチャをサポートし、ファイル パスを指定でき、キャプチャ完了後にプレビューを自動的に表示するかどうかを選択できます。
- ビデオストレージをサポートし、手動で録画を開始、録画を停止します。一部のカーネルは、録画を一時停止した後の録画の継続をサポートし、録画に必要のない部分をスキップします。
- 無意味な切り替えループ再生や自動再接続などの機構をサポートします。
- 再生の成功、再生の完了、デコードされた画像の受信、キャプチャされた画像の受信、ビデオ サイズの変更、録画ステータスの変更などの信号を提供します。
- マルチスレッド処理、1 つのデコード スレッド、メイン インターフェイスでのスタックなし。
4.2. 特徴
- qmedia カーネル (Qt4/Qt5/Qt6)、ffmpeg カーネル (ffmpeg2/ffmpeg3/ffmpeg4/ffmpeg5/ffmpeg6)、vlc カーネル (vlc2/vlc3)、mpv カーネル (mpv1/mp2) を含む複数のデコード カーネルを同時にサポートします。 mdk カーネル、Hikvision SDK、easyplayer カーネルなど。
- 非常に完全な複数の基本クラス設計により、新しいデコード カーネルを追加する際に必要なのは、メカニズム全体を適用するのに必要なコードの量が非常に少ないため、拡張が容易になります。
- 複数の画面表示戦略を同時にサポート、自動調整 (元の解像度がディスプレイ コントロールのサイズより小さい場合、元の解像度に従って表示されます。それ以外の場合は比例的に拡大縮小されます)、比例スケーリング (常に比例したスケーリング) )、ストレッチ充填(常に引き伸ばされて充填されます))。 3 つの画像表示戦略がすべてのコアとすべてのビデオ表示モードでサポートされています。
- 複数のビデオ表示モードを同時にサポート、ハンドル モード (受信したコントロール ハンドルは描画制御のために相手に渡されます)、描画モード (コールバックはデータを取得し、それを QPainter で描画するために QImage に変換します)、GPUモード (コールバックはデータを取得して yuv に変換します) QOpenglWidget 描画)。
- 複数のハードウェア アクセラレーション タイプをサポートし、ffmpeg は dxva2、d3d11va などを選択でき、vlc は any、dxva2、d3d11va、mpv は auto、dxva2、d3d11va を選択でき、mdk は dxva2、d3d11va、cuda、mft などを選択できます。システム環境が異なれば、選択できるタイプも異なります。たとえば、Linux システムには vaapi と vdpau があり、macos システムには videotoolbox があります。
- デコードスレッドと表示フォームが分離されており、任意のデコードコアを任意の表示フォームに実装するように指定し、動的に切り替えることができます。
- デフォルトで有効になり、自動的に処理される共有デコード スレッドをサポートします。同じビデオ アドレスが認識されると、デコード スレッドが共有されるため、ネットワーク ビデオ環境における他のデバイスのネットワーク トラフィックとストリーミングの負荷を大幅に節約できます。国内のトップビデオメーカーは皆この戦略を採用しています。このようにして、1 つのビデオ ストリームを取得する限り、それを数十または数百のチャネルで共有して表示できます。
- ビデオの回転角度を自動的に識別して描画します。たとえば、携帯電話で撮影したビデオは通常 90 度回転します。再生中に自動的に回転する必要があります。そうしないと、デフォルトで上下が逆になってしまいます。
- ビデオ ストリームの再生中に解像度の変化を自動的に識別し、ビデオ コントロールのサイズを自動的に調整します。たとえば、カメラは使用中に解像度を動的に構成できますが、解像度が変更された場合、対応するビデオ コントロールも同期して応答する必要があります。
- オーディオ ファイルとビデオ ファイルは認識されることなく自動的に切り替わり、ループ再生されます。また、切り替え中に黒い画面が表示されるなど、目に見える切り替えの痕跡はありません。
- ビデオ コントロールは、任意のデコード コア、任意のピクチャ表示戦略、および任意のビデオ表示モードもサポートします。
- ビデオ コントロール フローティング バーは、ハンドル、描画、GPU の 3 つのモードを同時にサポートし、非絶対座標を移動できます。
- ローカル カメラ デバイスは、再生用のデバイス名、解像度、およびフレーム レートの指定をサポートしています。
- ローカルデスクトップ収集では、収集領域、オフセット値、指定したデスクトップインデックス、フレームレート、複数デスクトップの同時収集などの設定をサポートしています。
- 録画ファイルは、開いているビデオ ファイル、ローカル カメラ、ローカル デスクトップ、ネットワーク ビデオ ストリームなどもサポートします。
- 存在しないビデオやネットワーク ストリームを開く場合、デバイスの存在を検出する場合、読み取り中にタイムアウトを待機する場合、直前の操作を即座に中断してシャットダウン コマンドを受信した後に応答する場合など、開閉に対する即時応答。
- さまざまな画像ファイルを開くことをサポートし、ローカルのオーディオおよびビデオ ファイルのドラッグ アンド ドロップ再生をサポートします。
- ビデオ ストリーミングの通信方式は tcp/udp ですが、デバイスによっては tcp などの特定のプロトコル通信しか提供していない場合もあるため、開くプロトコル方式を指定する必要があります。
- 接続タイムアウト(ビデオストリーム検出のタイムアウト)と読み取りタイムアウト(取得時のタイムアウト)を設定できます。
- フレームごとの再生をサポートし、前フレーム/次フレーム機能インターフェイスを提供し、収集した画像をフレームごとに表示できます。
- オーディオ ファイルからタイトル、アーティスト、アルバム、アルバム カバーなどのアルバム情報が自動的に抽出され、アルバム カバーが自動的に表示されます。
- ビデオ応答の遅延は約 0.2 秒と非常に低く、ビデオ ストリームを開くまでの応答は約 0.5 秒と非常に高速であり、特別に最適化されています。
- H264/H265 エンコード(現在、H265 ビデオ ストリーム形式を使用する監視カメラが増えています)をサポートしてビデオ ファイルを生成し、内部でエンコード形式を自動的に認識して切り替えます。
- 組み込みの解析およびエスケープ処理により、ユーザー情報に特殊文字 (ユーザー情報の +#@ などの文字) を含むビデオ ストリームの再生をサポートします。
- フィルター、さまざまな透かし、グラフィック効果をサポートし、複数の透かしと画像をサポートし、OSD タグ情報とさまざまなグラフィック情報を MP4 ファイルに書き込むことができます。
- AAC、PCM、G.726、G.711A、G.711Mu、G.711ulaw、G.711alaw、MP2L2 など、ビデオ ストリームでさまざまなオーディオ形式をサポートします。最高のクロスプラットフォーム互換性を得るには、AAC を選択することをお勧めします。 。
- カーネル ffmpeg は純粋な qt+ffmpeg デコードを使用し、SDL などのサードパーティの描画と再生に依存しません。GPU 描画は qopenglwidget を使用し、オーディオ再生は qaudiooutput を使用します。
- カーネル ffmpeg とカーネル mdk は Android をサポートしており、その中でも mdk は Android のハード デコードをサポートしており、パフォーマンスは非常に厳しいです。
- オーディオ トラックとビデオ トラック、つまりプログラム チャンネルを切り替えることができます。おそらく ts ファイルには複数のオーディオ プログラム ストリームとビデオ プログラム ストリームが含まれています。どれを再生するかをそれぞれ設定できます。再生前に設定することも、再生中に動的に設定することもできます。
- ビデオの回転角度は、再生前に設定でき、再生中に動的に設定できます。
- ビデオコントロールフローティングバーには、録画の開始と停止、サウンドのミュート、スクリーンショットの撮影、ビデオの終了などの機能が付属しています。
- オーディオ コンポーネントは、音響波形値データ分析をサポートしています。この値に基づいて波形曲線と円柱サウンド バーを描画できます。音響振幅信号はデフォルトで提供されます。
- ラベルとグラフィック情報は、マスク レイヤへの描画、ピクチャへの描画、およびソース描画の 3 つの描画方法をサポートします (対応する情報はファイルに保存できます)。
- URL アドレスを渡すことにより、他の設定を行わずに、そのアドレスから通信プロトコル、解像度、フレーム レートなどの情報を取得できます。
- ビデオをファイルに保存するには、自動処理、ファイルのみ、およびすべてのトランスコーディングの 3 つの戦略がサポートされています。トランスコーディング戦略は、自動識別、264 への変換、および 265 への変換をサポートします。エンコーディングの保存は、指定された解像度スケーリングまたは等倍スケーリングをサポートします。たとえば、保存するファイルのサイズに要件がある場合は、保存する前にスケーリングを指定できます。
- 暗号化保存ファイルと復号再生ファイルに対応し、秘密鍵のテキストを指定できます。
- 電子拡大に対応しており、フローティングバーで電子拡大モードに切り替え、画面上で拡大したい部分を選択すると、選択後自動的に拡大され、再度倍率モードを切り替えることでリセットできます。
- 各コンポーネントの非常に詳細な印刷情報プロンプト、特にエラー メッセージ プロンプト、およびパッケージング用の統一された印刷形式。複雑な機器環境を現場でテストすることは非常に便利で役に立ちます。これは、問題が発生した特定のチャネルとステップを特定することに相当します。
- 同時に、簡単なサンプル、ビデオプレーヤー、マルチスクリーンビデオモニタリング、モニタリング再生、フレームバイフレーム再生、マルチスクリーンレンダリングなどの別の形式のサンプルが提供され、対応する機能の使用方法を具体的に示します。
- コードのフレームワークと構造は最適化されており、パフォーマンスは強力で、継続的に更新およびアップグレードされています。
- ソース コードは Qt4、Qt5、および Qt6 をサポートしており、すべてのバージョンと互換性があります。
4.3. ビデオコントロール
- osdタグ情報は、名前、表示/非表示、フォントサイズ、文字テキスト、文字色、背景色、タグ画像、タグ座標、タグ形式(テキスト、日付、時刻、日付時刻)を含めて動的に追加できます。 、画像)、ラベルの位置 (左上隅、左下隅、右上隅、右下隅、中央、カスタム座標)。
- 任意の量のグラフィック情報を動的に追加できるため、非常に便利です。たとえば、人工知能アルゴリズムによって分析されたグラフィック領域情報をビデオ コントロールに直接送信できます。グラフィック情報は任意の形状をサポートし、絶対座標を使用して元の画像上に直接描画されます。
- グラフィック情報には、名前、境界線のサイズ、境界線の色、背景色、長方形領域、パスセット、点座標セットなどが含まれます。
- 各グラフィック情報は 3 つの領域のうち 1 つ以上を指定でき、指定された領域が描画されます。
- フローティングバーコントロールを内蔵しており、フローティングバーの位置は上下左右をサポートします。
- フローティング バー コントロールのパラメーターには、マージン、間隔、背景の透明度、背景色、テキストの色、押された色、位置、ボタン アイコン コード セット、ボタン名識別セット、およびボタン プロンプト情報セットが含まれます。
- フローティング バー コントロールのツール ボタンの行はカスタマイズ可能で、構造パラメータ設定を通じて、アイコンのグラフィック フォントやカスタム画像を選択できます。
- フローティングバーボタンはビデオの切り替え、スクリーンショットのキャプチャ、ミュートの切り替え、ビデオを閉じるなどの機能を内部で実装しており、対応する独自の機能をソースコードに追加することもできます。
- フローティングバーボタンは機能を実装したボタンに対応しており、ビデオボタンを押した後は録画中のアイコンに切り替わり、サウンドボタンを押した後はアイコンの切り替え処理が対応しています。がミュートアイコンになり、再度切り替えると復帰します。
- フローティングバーボタンがクリックされると、ユニークな名前でシグナルとして送出され、単独でレスポンス処理に関連付けることができます。
- フローティング バーの空白領域にプロンプト情報を表示できます。デフォルトで現在のビデオ解像度が表示されます。フレーム レートやビット ストリーム サイズなどの情報を追加できます。
- ビデオ コントロール パラメーターには、境界線のサイズ、境界線の色、フォーカスの色、背景色 (デフォルトは透明)、テキストの色 (デフォルトのグローバル テキスト色)、塗りつぶしの色 (ビデオの外側の空白スペースは黒で埋められます)、背景テキスト、背景画像 (設定されている場合、写真が最初に撮影されます)、写真をコピーするかどうか、ズーム表示モード (自動調整、プロポーショナル スケーリング、ストレッチ フィル)、ビデオ表示モード (ハンドル、描画、GPU)、フローティング バーを有効にする、フローティング バーのサイズ (水平は高さ、垂直方向は幅です)、フローティングバーの位置(上、下、左、右)。