VC++ 官方播放器 CPlayerDlg 核心流程分析
- OnInitDialog:初始化音量、判斷開啟模式 (檔案/串流)、註冊結束/編碼變更訊息
- OpenFile / SetOpenState:開啟檔案、取得畫面尺寸、設定疊加模式、顯示統計資訊 (總幀數、總時長)
- Play:啟動播放與聲音
- 本篇不討論直接從記憶體串流播放模式
C# 非完全對應實作 (WinForms)
欄位與初始化
// 播放埠號:0~15 可用
private int PORT = 0;
// 目前播放檔案路徑
private string m_strPlayFileName;
private void Form3_Load(object sender, EventArgs e)
{
// 設定最大音量
HikPlayer.Hik_PlayM4_SetVolume(PORT, 0xFFFF);
// 註冊檔案播放結束訊息
HikPlayer.Hik_PlayM4_SetFileEndMsg(PORT, pVideo.Handle, HikPlayer.WM_FILE_END);
// 註冊編碼參數變更訊息
HikPlayer.Hik_PlayM4_SetEncChangeMsg(PORT, pVideo.Handle, HikPlayer.WM_ENC_CHANGE);
}
開啟檔案並播放
private void btnPlay_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
m_strPlayFileName = openFileDialog1.FileName;
if (!string.IsNullOrEmpty(m_strPlayFileName))
{
OpenFile();
// 設定畫質優化
HikPlayer.Hik_PlayM4_SetPicQuality(PORT, true);
}
else
MessageBox.Show("請選擇檔案!!");
}
}
private void OpenFile()
{
// 開啟播放檔案
HikPlayer.Hik_PlayM4_OpenFile(PORT, m_strPlayFileName);
Play();
}
public void SetOpenState()
{
int m_nWidth, m_nHeight;
// 取得原始影像尺寸,可據此自動調整播放器大小
HikPlayer.Hik_PlayM4_GetPictureSize(PORT, out m_nWidth, out m_nHeight);
// 設定覆蓋模式:洋紅色 (255,0,255) 作為透明色鍵
HikPlayer.Hik_PlayM4_SetOverlayMode(PORT, true, Color.FromArgb(255, 0, 255).ToArgb());
}
private void Play()
{
// 開始播放影像
HikPlayer.Hik_PlayM4_Play(PORT, pVideo.Handle);
// 播放聲音
HikPlayer.Hik_PlayM4_PlaySound(PORT);
}
關鍵技術點說明
- 相對 VC++ 簡化:省略空委托、統計資訊顯示、多種開啟模式判斷等邏輯
- 檔案開啟失敗排查:若
OpenFile 失敗,通常是錄影檔本身有問題。請先用官方附贈播放器拖曳測試該 .264 檔
- 建議補充:
try-catch 錯誤處理、播放狀態旗標管理、UI 執行緒安全呼叫
- 視窗控制代碼:
pVideo.Handle 為 PictureBox 或 Panel 的 Handle 屬性,作為繪圖目標視窗
常見錯誤碼對照
| 錯誤碼 | 含義 | 處理建議 |
| 1 | 檔案不存在/路徑錯誤 | 檢查路徑、權限 |
| 2 | 檔案格式不支援 | 確認為標準 .264,嘗試官方播放器驗證 |
| 3 | 埠號已被佔用 | 換 PORT (0~15) 或先 Stop/CloseFile |
| 4 | 解碼器初始化失敗 | 檢查系統編碼器、重裝 SDK |