本文詳細實作基於海康 HikPlayM4.dll 的 H264 播放器核心控制功能,包含播放/暫停/停止、快進/慢放、跳轉首尾、截圖存檔,並對照 VC++ 原始碼說明關鍵 API 差異。
// 播放或從暫停恢復
private void btnPlay_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(m_strPlayFileName))
{
if (isPause)
{
HikPlayer.Hik_PlayM4_Pause(PORT, false);
isPause = false;
}
else
{
OpenFile(); // 首次播放
}
}
}
// 暫停
private void btnPause_Click(object sender, EventArgs e)
{
HikPlayer.Hik_PlayM4_Pause(PORT, true);
isPause = true;
}
// 停止並釋放資源
private void btnStop_Click(object sender, EventArgs e)
{
HikPlayer.Hik_PlayM4_Stop(PORT);
HikPlayer.Hik_PlayM4_CloseFile(PORT);
HikPlayer.Hik_PlayM4_RealeseDDraw();
pVideo.Invalidate(true);
}
關鍵點:Hik_PlayM4_Pause 第二參數 true=暫停、false=恢復;停止時務必呼叫 CloseFile 與 RealeseDDraw 釋放解碼資源。
int m_nSpeed = 0;
private void btnFastForward_Click(object sender, EventArgs e)
{
if (HikPlayer.Hik_PlayM4_Fast(PORT))
{
m_nSpeed++;
if (m_nSpeed > 0) OnThrow2(); // 丟棄 B 幀提升效能
}
}
private void btnFastBackward_Click(object sender, EventArgs e)
{
if (HikPlayer.Hik_PlayM4_Slow(PORT))
{
m_nSpeed--;
if (m_nSpeed <= 0) OnThrow0();
}
}
public void OnThrow0() => HikPlayer.Hik_PlayM4_ThrowBFrameNum(PORT, 0);
public void OnThrow2() => HikPlayer.Hik_PlayM4_ThrowBFrameNum(PORT, 2);
說明:Fast 每呼叫一次速度加倍(最多 4 次);Slow 每呼叫一次減半(最多 4 次);恢復正常速度需呼叫 Play()。
private void btnGotoStart_Click(object sender, EventArgs e)
=> HikPlayer.Hik_PlayM4_SetPlayPos(PORT, 0); // 0 = 開頭
private void btnGotoEnd_Click(object sender, EventArgs e)
=> HikPlayer.Hik_PlayM4_SetPlayPos(PORT, 1); // 1 = 結尾
注意:SetPlayPos 參數範圍 0~1(相對位置),跳至結尾後可能延遲 3 秒才停止。
透過設定顯示回調,在回調中將當前幀轉為 BMP 存檔:
private DisplayCBFun DisCB;
private void btnCapImage_Click(object sender, EventArgs e)
{
DisCB = new DisplayCBFun(DisplayCBFun);
HikPlayer.Hik_PlayM4_SetDisplayCallBack(PORT, DisCB);
}
public void DisplayCBFun(int nPort, IntPtr pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, int nReceaved)
{
string path = $@"C:\capture{nPort}.bmp";
if (!HikPlayer.Hik_PLayM4_ConvertToBmpFile(pBuf, nSize, nWidth, nHeight, nType, path))
MessageBox.Show("轉換 BMP 失敗!");
// 單次截圖後移除回調
HikPlayer.Hik_PlayM4_SetDisplayCallBack(PORT, null);
}
關鍵點:回調中需儘快返回;截圖完成後將回調設為 null 停止持續觸發。
本文所有 C# 方法均對應 VC++ Demo 中的 CPlayerDlg::Play()、Pause()、Stop()、OnFastForward()、OnGotoStart()、DisplayCBFun 等函式,參數轉換遵循系列(14)型別對應表。