I.はじめに
ビデオストレージ用のHaikang SDKの呼び出しに関して、フレームワークアーキテクチャの全体的な処理フローは、vlc、ffmpeg、およびmpvコアの以前のプラクティスに従います。タイミングストレージについては、タイマーを設定して判断し、時間が来たら元のビデオストレージを閉じます。 、次に新しいビデオストレージを開始し、新しいファイル名を再入力して、このコードを直接コピーして使用できるようにします。2行のコードを置き換えるだけで、1行がビデオストレージを開始するNET_DVR_SaveRealData関数です。 1行は、ビデオストレージを停止する関数NET_DVR_StopSaveRealDataです。HikvisionSDKのマニュアルは非常に詳細であり、名前は比較的標準的です。基本的に、メソッドの関数名で一般的な意味を知ることができ、推測する必要はありません。
ビデオストレージ機能と同じカテゴリのスクリーンショット機能もあります。これは、vlcカーネル、ffmpegカーネル、およびmpvカーネルに実装されています。スクリーンショットには、3つのタイプがまとめられています。1つ目は、ハンドルモードのスクリーンショットです。これを呼び出す必要があります。実行する関連SDK関数、解像度サイズは元の画像、2番目はコールバックモードのスクリーンショットです。これはすでに画像データを取得しており、保存されたビデオに対応する画像をフォームに保存するだけで、解像度サイズは元のサイズになります。図; 3番目のタイプは、現在のビデオウィンドウのスクリーンショットであるウィンドウのスクリーンショットであり、解像度は現在のウィンドウのサイズです。
動画ファイルを開く、動画を保存する、スクリーンショットを保存するという3つの機能については、中国語のパスに特に注意してください。もちろん、英語のパスしかなければ処理は必要ありませんが、中国人にとっては中国語のパスは避けられません。 2つの可能な処理があります。1つはパスをutf8形式に変換する必要があること、もう1つはQTextCodecを使用してgb2312形式を指定し、パスを再変換して有効にすることです。たとえば、Haikang sdkカーネルでは、パスが無効になる場合があります。
2.機能
- ビデオストリームとローカルMP4ファイルの再生をサポートします。
- ハンドルとコールバックの2つのモードをサポートします。
- メインインターフェイスにスタックされていないマルチスレッドディスプレイイメージ。
- Webカメラを自動的に再接続します。
- 境界線のサイズ、オフセット、境界線の色を設定できます。
- OSDラベルを描画するかどうか、つまりラベルテキストまたは画像とラベル位置を描画するかどうかを設定できます。
- 2つのOSD位置とスタイルを設定できます。
- ファイルに保存するかどうか、ファイル名を設定できます。
- ファイルを直接haikangwidgetコントロールにドラッグして再生できます。
- h264 / h265ビデオストリームをサポートします。
- 再生を一時停止して再開できます。
- 単一のビデオファイルのストレージとビデオファイルのタイミングストレージをサポートします。
- 上部のフローティングバーをカスタマイズし、クリック信号通知を送信して、それを有効にするかどうかを設定します。
- 画面のストレッチ塗りつぶしまたは同じ比率の塗りつぶしを設定できます。
- デコードを速度優先、品質優先、およびイコライゼーション処理に設定できます。
- ビデオのスクリーンショット(元の写真)とスクリーンショット(ビデオ形式)を撮ることができます。
- ビデオファイルはMP4ファイルとして保存されます。
- フォーカス制御、パン/チルト制御をサポートします。
- カスタマイズ可能な機能。
3、レンダリング
4、関連サイト
- 国内サイト:https : //gitee.com/feiyangqingyun/QWidgetDemo
- 国際サイト:https : //github.com/feiyangqingyun/QWidgetDemo
- 個人ホームページ:https : //blog.csdn.net/feiyangqingyun
- Zhihuホームページ:https ://www.zhihu.com/people/feiyangqingyun/
- エクスペリエンスアドレス:https : //blog.csdn.net/feiyangqingyun/article/details/97565652
5、コアコード
void HaiKangThread::initSave()
{
if (!saveFile || !isRtsp) {
return;
}
if (saveInterval == 0) {
saveVideo(fileName);
}
}
void HaiKangThread::saveVideo()
{
if (!saveFile || !isRtsp) {
return;
}
//重新设置文件名称
QString dirName = QString("%1/%2").arg(savePath).arg(QDATE);
newDir(dirName);
fileName = QString("%1/%2_%3.mp4").arg(dirName).arg(fileFlag).arg(STRDATETIME);
saveVideo(fileName);
}
void HaiKangThread::saveVideo(const QString &fileName)
{
if (hand >= 0) {
//转码以便支持中文路径
QTextCodec *codec = QTextCodec::codecForName("gb2312");
QByteArray data = codec->fromUnicode(fileName);
//先停止再设置
NET_DVR_StopSaveRealData(hand);
NET_DVR_SaveRealData(hand, data.data());
}
}