C# 視頻監控系列(12):H264播放器——播放錄影檔案

來源:互聯網
上載者:User

 

前言

     本章主要實現播放海康錄影檔案,更多播放器說明可以參考《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.     建議補充錯誤處理。

 

結束

     加油~~~快接近尾聲了 : )

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.