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

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

     編輯:關於C語言

一、播放控制核心邏輯

1.1 暫停/播放/停止 — VC++ 官方完整邏輯

void CPlayerDlg::Play()
{
    m_nSpeed = 0;
    OnThrow0(); // 重設 B 幀丟棄
    
    if(m_bConvert)
        Hik_PlayM4_SetDecCallBack(PORT, DecCBFun);
    else
        m_pMainMenu->EnableMenuItem(ID_FILE_CLOSE, FALSE);
    
    if(m_bPlaying)
    {
        // 已在播放中:直接重新 Play (切換速度用)
        Hik_PlayM4_Play(PORT, GetDlgItem(IDC_SHOW)->m_hWnd);
    }
    else
    {
        // 首次播放或停止後重播
        if(m_bStreamType)
        {
            ::SetFilePointer(m_hStreamFile, m_nHeadSize, 0, FILE_BEGIN);
            Hik_PlayM4_ResetSourceBuffer(PORT);
            SetEvent(m_hEventInput);
        }
        m_bPlaying = Hik_PlayM4_Play(PORT, GetDlgItem(IDC_SHOW)->m_hWnd);
        m_bSound = Hik_PlayM4_PlaySound(PORT);
        if(m_bPlaying)
            SetTimer(PLAY_TIMER, 500, NULL); // 統計計時器
    }
    
    if(m_bPlaying)
        SetPlayState();
    else
    {
        CString csError;
        csError.Format("Play the file faild.(%d)", Hik_PlayM4_GetLastError(PORT));
        AfxMessageBox(csError);
    }
}

void CPlayerDlg::Pause(BOOL bPause)
{
    if(m_bPaused == bPause) return;
    m_bPaused = bPause;
    Hik_PlayM4_Pause(PORT, bPause);
    TRACE("PAUSE %d\n", m_bPaused);
}

void CPlayerDlg::Stop()
{
    if(!m_bPlaying) return;
    KillTimer(PLAY_TIMER);
    
    if(Hik_PlayM4_StopSound())
    {
        m_bSound = FALSE;
        // 更新音量圖示...
    }
    m_bPause = FALSE;
    
    m_bPlaying = !Hik_PlayM4_Stop(PORT);
    if(!m_bPlaying)
    {
        SetStopState();
        if(m_bStreamType)
            ResetEvent(m_hEventInput);
    }
}

核心流程解析

  1. Play() 多重語意:
    • 首次播放:OpenFile → Play → PlaySound
    • 暫停後繼續:Pause(false) → Play
    • 變速後恢復正速:Play() 重新呼叫
    • 串流模式:需重設檔案指標、重置緩衝區、觸發輸入事件
  2. Pause() 狀態保護:避免重複設定相同狀態
  3. Stop() 完整清理:
    • 停止計時器
    • 停止音訊
    • 重置暫停旗標
    • 停止解碼、更新 UI 狀態
    • 串流模式額外重置事件物件
  4. 錯誤處理:播放失敗時呼叫 GetLastError 顯示錯誤碼

關鍵狀態變數對照

VC++ 變數型別C# 對應用途
m_bPlayingBOOLisPlaying是否正在播放
m_bPausedBOOLisPause是否暫停
m_bSoundBOOLisSoundOn音訊是否播放中
m_nSpeedintm_nSpeed速度層級 (0=正常, ±1~4)
m_bStreamTypeBOOLisStreamMode串流模式 vs 檔案模式

下篇將實作 C# 版本的播放/暫停/停止完整代碼。

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