I.はじめに
Hikvision SDKにはMP4デコードおよび再生ライブラリが含まれています。対応するAPI関数はすべてPlayM4で始まります。名前が示すように、MP4を再生します。HikvisionのビデオはデフォルトでMP4ファイルとして保存でき、一般的なプレーヤーで再生できます。そのためです。多くの記事で言及されているさまざまなコアビデオストレージは、vlc、mpv、ffmpegなどのストレージ用にMP4に変更されており、最終的なビデオストレージはMP4ファイルに変換されています。大企業やメーカーもMP4ファイルとして保存しているようです。彼の理由があります。どのくらいの理由があるかについては、彼の学者に従ってこのように対処してください。質問せずにコードを書き始めることができます。いくつかを徹底的に調査する必要があるものと、あまり注意深く尋ねる必要がないものがあります。行き止まりです。1+ 1 = 2だと知っているようなものです。why= 2については、専任の研究者にお任せください。
Haikang SDKのMP4デコードライブラリは、独自のMP4ファイルと通常のMP4ファイルをサポートしており、最新バージョンはAVIファイル形式もサポートしています。ローカルのMP4ファイルを試したところ、すべてサポートされています。オーディオを取得する必要がある場合ビデオデータの場合、PlayM4_SetDecCallBackMendを呼び出すだけで、デコードコールバック関数を設定できます。これは、ビデオストリームのコールバックプロセスよりもはるかに簡単です。コールバック処理関数を設定するための処理はそれほど多くなく、デコードしてQImageに変換するだけで済みます。ローカルファイルはファイル終了コールバックを追加する必要もあります。これにより、ファイルがいつ再生され、対応する信号が処理のために送信されるかを知ることができます。QMetaObject:: invokeMethodの非同期実行により、PlayM4_SetFileEndCallbackを呼び出してFileEndCallbackコールバック関数でファイル再生完了コールバック関数を設定できます。インターフェイスに通知する機能を停止します。
ローカルファイルについては、次の点に注意してください。
- ファイル再生モードでは、PlayM4_CloseStreamを呼び出すことはできません。
- ストリーミング再生では、PlayM4_CloseFileインターフェースを呼び出すことができません。
- ストリームスイッチインターフェイスとファイルスイッチインターフェイスは、相互に使用できません。
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、コアコード
bool HaiKangThread::playLocal()
{
//转码以便支持中文路径
QTextCodec *codec = QTextCodec::codecForName("gb2312");
QByteArray data = codec->fromUnicode(url);
PlayM4_GetPort(&port);
bool ok = PlayM4_OpenFile(port, data.data());
if (ok) {
//设置文件播放完毕回调函数
PlayM4_SetFileEndCallback(port, FileEndCallback, this);
//回调则可以拿到音视频数据,否则就直接句柄播放
if (callback) {
PlayM4_SetDecCallBackMend(port, DecCallBack, (quser)this);
PlayM4_Play(port, NULL);
} else {
PlayM4_Play(port, (HWND)playWidget->winId());
}
//同时播放声音
PlayM4_PlaySound(port);
//倒放
//PlayM4_ReversePlay(port);
//快进播放,多次调用速度更快
//PlayM4_Fast(port);
//PlayM4_Fast(port);
ok = true;
qDebug() << TIMEMS << "打开视频文件成功" << url;
} else {
qDebug() << TIMEMS << "打开视频文件失败" << url << PlayM4_GetLastError(port);
}
return ok;
}
void HaiKangThread::free()
{
if (isRtsp) {
//停止播放+登出设备
NET_DVR_StopRealPlay(hand);
NET_DVR_Logout(hand);
hand = -1;
} else {
//停止播放+关闭文件+释放端口
PlayM4_Stop(port);
PlayM4_StopSound();
PlayM4_CloseFile(port);
PlayM4_FreePort(port);
port = -1;
}
}