前言
本章主要實現播放海康錄影檔案,更多播放器說明可以參考《Hikvision H264播放器編程指南V4.8》。
注意
本系列文章限於學習交流,注重過程,由於涉及公司,所以不提供原始碼下載,非常抱歉!!但是請大家放心,核心、實現以及其他能夠貼出來的代碼我都會貼出來,並且爭取盡所能的回答留言裡的每一個問題,感謝大家關注,歡迎交流
系列
1. C# 視頻監控系列(1):準備
2. C# 視頻監控系列(2):用戶端——封裝API
3. C# 視頻監控系列(3):用戶端——串連伺服器
4. C# 視頻監控系列(4):用戶端——音頻接收和抓圖
5. C# 視頻監控系列(5):用戶端——給伺服器端發送字串和錄影(資料擷取)
6. C# 視頻監控系列(6):伺服器端——封裝API(上) [HikServer.dll]
7. C# 視頻監控系列(7):伺服器端——封裝API(下) [DS40xxSDK.dll]
8. C# 視頻監控系列(8):伺服器端——預覽和可被用戶端串連
9. C# 視頻監控系列(9):伺服器端——資料擷取(抓圖 + 錄影)
10. C# 視頻監控系列(10):伺服器端——驗證、設定畫面品質、字幕疊加、板卡序號
11. C# 視頻監控系列(11):H264播放器——封裝API[HikPlayM4.dll]
12. C# 視頻監控系列(12):H264播放器——播放錄影檔案
本文
先來一張簡單的
以下幾個VC++ 程式碼片段:
CPlayerDlg::OnInitDialog()
Hik_PlayM4_SetVolume(PORT,m_SoundSlider.GetPos());
// 其他代碼
//set the capture picture call back function;
Hik_PlayM4_SetDisplayCallBack(PORT,DisplayCBFun);
//set the wave audio call back funtion;
Hik_PlayM4_SetAudioCallBack(PORT,WaveCBFun, (long)this);
// 其他代碼
Hik_PlayM4_SetEncTypeChangeCallBack(PORT,funEncChange,(long)this);
#if (WINVER > 0x0400)
//If do not support multi monitor,may not call!
Hik_PlayM4_InitDDrawDevice();
Hik_PlayM4_SetDDrawDevice(PORT,0);
#endif
//Test adapter Capability;
TestCapability(0);
Hik_PlayM4_SetFileEndMsg(PORT,m_hWnd,WM_FILE_END);
Hik_PlayM4_SetEncChangeMsg(PORT,m_hWnd,WM_ENC_CHANGE);
if(m_strPlayFileName.Compare(""))
{
if(m_bStreamType)
OpenStream();
else
OpenFile();
}
CPlayerDlg::OpenFile()
Hik_PlayM4_SetFileRefCallBack(PORT,FileRefDone,(DWORD)this);
Hik_PlayM4_SetVerifyCallBack(PORT, 0, 0xffffffff, VerifyFun, (DWORD) this);// verify the whole file;
if(!Hik_PlayM4_OpenFile(PORT,m_strPlayFileName.GetBuffer(m_strPlayFileName.GetLength())))
{
m_strPlayFileName="";
CString csError;
csError.Format("Open file failed(%d)",Hik_PlayM4_GetLastError(PORT));
MessageBox(csError);
return ;
}
SetOpenState();
m_nMaxFileTime=Hik_PlayM4_GetFileTime(PORT);
if(!m_nMaxFileTime)
{
MessageBox("File seconds is zero");
return;
}
m_nTotalHour=m_nMaxFileTime/3600;
m_nTotalMinute=(m_nMaxFileTime%3600)/60;
m_nTotalSecond=m_nMaxFileTime%60;
m_nTotalFrames=Hik_PlayM4_GetFileTotalFrames(PORT);
numFrames=m_nTotalFrames;
//If you want to change the display buffer. Do hear!
//Hik_PlayM4_SetDisplayBuf(PORT,25);
Play();
CPlayerDlg::Play()
OnThrow0();
//#ifdef _TEST_CALLBACK
if(m_bConvert)
Hik_PlayM4_SetDecCallBack(PORT,DecCBFun);
else
m_pMainMenu->EnableMenuItem(ID_FILE_CLOSE, FALSE);
//#endif
if(m_bPlaying)
{
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);
}
CPlayerDlg::SetOpenState()
Hik_PlayM4_GetPictureSize(PORT,&m_nWidth,&m_nHeight);
Hik_PlayM4_SetOverlayMode(PORT,TRUE,RGB(255,0,255));
程式碼分析:
1. 從OnInitDialog部分代碼可以看出主要是設定聲音、判斷是不是雙擊視頻檔案或者直接從流中讀取資料。
2. OpenFile和SetOpenState是開啟檔案、設定畫面大小、顯示統計資訊,如總幀數、視頻總時間。
3. Play播放開啟的視頻檔案。
4. 注意這裡不討論直接從流中讀取資料並播放。
以下是非完全對應的C# Code:
//uesed port;can be from 0 to 15;
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);
}
/// <summary>
/// 開啟檔案並播放
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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()
{
//m_bOpen=TRUE;
int m_nWidth, m_nHeight;
//擷取原始映像的大小,可根據這個自動化佈建播放器大小
HikPlayer.Hik_PlayM4_GetPictureSize(PORT, out m_nWidth, out m_nHeight);
HikPlayer.Hik_PlayM4_SetOverlayMode(PORT, true, Color.FromArgb(255, 0, 255).ToArgb());
}
private void Play()
{
//開始播放
HikPlayer.Hik_PlayM4_Play(PORT, pVideo.Handle);//this.Handle);
//播放聲音
HikPlayer.Hik_PlayM4_PlaySound(PORT);
}
代碼說明:
1. 相對於VC++例子,這裡省略了許多代碼,比如空委託、顯示統計資訊等。
2. 如果檔案開啟出錯,有可能是前面視頻錄影檔案有問題,你可以先用內建的播放器試一下。
3. 建議補充錯誤處理。
結束
加油~~~快接近尾聲了 : )