首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 視訊監控系列(13):H264 播放器控制播放與截圖功能完整實作

     編輯:關於C#

本文詳細實作基於海康 HikPlayM4.dll 的 H264 播放器核心控制功能,包含播放/暫停/停止、快進/慢放、跳轉首尾、截圖存檔,並對照 VC++ 原始碼說明關鍵 API 差異。

一、播放控制

1.1 播放 / 暫停 / 停止


// 播放或從暫停恢復
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 釋放解碼資源。

1.2 快進 / 慢放


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()。

1.3 跳轉首尾


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 停止持續觸發。

VC++ 對照參考

本文所有 C# 方法均對應 VC++ Demo 中的 CPlayerDlg::Play()、Pause()、Stop()、OnFastForward()、OnGotoStart()、DisplayCBFun 等函式,參數轉換遵循系列(14)型別對應表。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved