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