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

C# 視訊監控系列(十三):H.264 播放器——播放控制與截圖(四)

     編輯:關於C語言

1.2 快進/慢放 (Fast/Slow Playback)

API 行為規格

  • Hik_PlayM4_Fast:每呼叫一次**速度加倍**,最多 4 次 (最高 16倍速);呼叫 Hik_PlayM4_Play() 恢復正常速度
  • Hik_PlayM4_Slow:每呼叫一次**速度減半**,最多 4 次 (最慢 1/16 倍速);呼叫 Hik_PlayM4_Play() 恢復正常速度

VC++ 實作邏輯

void CPlayerDlg::OnFastForward()
{
    if(Hik_PlayM4_Fast(PORT))
    {
        m_nSpeed++;
        if(m_nSpeed > 0) OnThrow2(); // 丟棄 B 幀提升效能
        SetFastForwardState();
    }
}

void CPlayerDlg::OnFastBackward()
{
    if(Hik_PlayM4_Slow(PORT))
    {
        m_nSpeed--;
        if(m_nSpeed <= 0) OnThrow0(); // 恢復不丟幀
        SetFastBackWardState();
    }
}

C# 實作

private 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(); // 丟棄 2 個 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);
}

1.3 跳轉至開頭/結尾 (Go to Start/End)

VC++ 邏輯:區分檔案索引模式與串流模式

void CPlayerDlg::OnGotoStart()
{
    if(m_bFileRefCreated)
        Hik_PlayM4_SetCurrentFrameNum(PORT, 0); // 以幀號定位
    else
        Hik_PlayM4_SetPlayPos(PORT, 0); // 以比例定位
}

void CPlayerDlg::OnGotoEnd()
{
    if(m_bFileRefCreated)
    {
        int nEndFrame = m_nTotalFrames;
        // 避免觸發大量 WM_FILE_END,需同步處理
        while(!Hik_PlayM4_SetCurrentFrameNum(PORT, nEndFrame--))
        {
            if(nEndFrame == 0) break;
        }
    }
    else
        Hik_PlayM4_SetPlayPos(PORT, 1);
}

C# 簡化實作:統一用比例定位

/// 
/// 跳轉至開頭
/// 
private void btnGotoStart_Click(object sender, EventArgs e)
{
    HikPlayer.Hik_PlayM4_SetPlayPos(PORT, 0);
}

/// 
/// 跳轉至結尾
/// 
private void btnGotoEnd_Click(object sender, EventArgs e)
{
    HikPlayer.Hik_PlayM4_SetPlayPos(PORT, 1);
}

關鍵行為觀察

  • Hik_PlayM4_SetPlayPos 第二參數範圍 0.0 ~ 1.0 (double),0=開頭,1=結尾
  • 已知怪異行為:跳轉至結尾 (1.0) 後,畫面會**延遲約 3 秒**才真正停在最後一幀,推測為內部緩衝區排空機制
  • 若需精確幀級定位,需用 Hik_PlayM4_SetCurrentFrameNum 搭配 GetTotalFrameNum
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved