流媒體二次開發 -- C++

努力的藍精靈發表於2013-10-03

好了,現在讓我們先從VC6.0開始研究海康流媒體二次開發吧。

    首先,聯絡杭州海康威視官方獲取流媒體二次開發SDK文件和Demo示例(client.dll,PlayM4.dll)這兩個Dll檔案是進行流媒體二次開發必需DLL。接著,用官方Demo裡的.exe程式測試你所獲取的流媒體實時流是否可用。好了,到這裡如果可以看到視訊播放了,那麼你的流媒體實時流URL就是正確的了。

    執行VC6.0,開啟clientTest工程檔案,如果沒有看見clientTest.dsw,可以任意開啟一個.cpp檔案,編譯時系統自動生成.dsw工程檔案。這裡需注意的是,本文運用的是VC6.0,因此海康Demo裡的例子編譯會提示出錯資訊:無法識別關鍵字super。在研究過程中,我將這些編譯錯誤一一解決,編譯通過,但是執行時,卻無啟動任何操作介面。於是結合SDK開發文件,研究Demo裡流媒體播放的程式碼,發現不是很複雜,於是就自己在VC6.0重新寫一個測試流媒體播放的程式。

1. C++新建MFC AppWizard[exe]工程(單個或多個Dialog)

流媒體二次開發 <wbr>-- <wbr>C++

2. 在Dialog上拖拉picture,button,editbox控制元件,並右擊屬性更改控制元件名稱

流媒體二次開發 <wbr>-- <wbr>C++ 

這裡的picture裡的Image可以通過選單Insert-Resource,匯入圖片(系統自動命名IDB_BITMAP1),然後在上述picture屬性框中Image選擇匯入圖片名稱即可。

流媒體二次開發 <wbr>-- <wbr>C++ 

3. 接著選擇button,右擊選中ClassWizard,新增點選事件

流媒體二次開發 <wbr>-- <wbr>C++ 

(1)可以看到Button預設有BN_CLICKED,BN_DOUBLECLICKED事件,因此可以不必再新增。

(2)可以看見Dialog中所有控制元件都在此顯示,因此在這裡我們為EditBox新增變數

流媒體二次開發 <wbr>-- <wbr>C++

4. 右擊Button,選擇Events,可以更改單擊事件名稱OnBtnPlay

5. 雙擊Button,進入點選事件,可以在此編寫播放事件(暫時不編寫,等待準備工作就緒再編寫)

6. 工程FileView檢視-HeadFiles匯入client.h,clntsink.h

7. 更改clientTestDlg.h檔案,繼承clntsink回撥函式集,並宣告2個全域性變數,int m_hSession;int m_hdown;

#include "client.h"

#include "afxcmn.h"

#include "afxwin.h"

#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////

// CClientTestDlg dialog

#define NORMALBACK

 

#ifdef NORMALBACK

class CClientTestDlg : public CDialog,public IHikClientAdviseSink

#else

class CClientTestDlg : public CDialog

#endif

{

// Construction

public:

         CClientTestDlg(CWnd* pParent = NULL);      // standard constructor

#ifdef NORMALBACK

         virtual int OnPosLength(unsigned long nLength);

         virtual int OnPresentationOpened(int success);

         virtual int OnPresentationClosed();

         virtual int OnPreSeek(unsigned long uOldTime, unsigned long uNewTime);

         virtual int OnPostSeek(unsigned long uOldTime, unsigned long uNewTime);        

         virtual int OnStop();

         virtual int OnPause(unsigned long uTime);

         virtual int OnBegin(unsigned long uTime);

         virtual int OnRandomBegin(unsigned long uTime);

         virtual int OnContacting(const char* pszHost);

         virtual int OnBuffering(unsigned int uFlag, unsigned short uPercentComplete);

         virtual int OnPutErrorMsg(const char* pError);

         virtual int OnChangeRate(int flag);

         virtual int OnDisconnect();

#endif

.....................

public:

         int m_hSession;

         int m_hdown;

8. 更改clientTest.cpp檔案(引用client.h),在初始化InitInstance中加入InitStreamClientLib();,     FiniStreamClientLib();

9. 到這裡,我們可以開始在clientTestDlg.cpp(引用client.h, clintsink.h)中編寫Button點選事件:

       // TODO: Add your control notification handler code here

                  int nRet;

         if (m_hSession >=0)

         {

    nRet=HIKS_Stop(m_hSession);

         m_opened=-1;

         }

 HWND hWnd = GetDlgItem(IDC_STATIC_PictureShow)->GetSafeHwnd();

 m_hSession=HIKS_CreatePlayer(this,hWnd,DoRecord);

         if (m_hSession!=-1)

         {

                  UpdateData(true);

                  nRet=HIKS_OpenURL(m_hSession,m_URLvalue.GetBuffer(0),0);

                  if (nRet != 1)

                  {

                           HIKS_Destroy(m_hSession);

                           m_hSession=-1;

                           m_opened=-1;

                           return;

                  }

         }

         while (m_opened < 0)

         {

                  Sleep(500);

         }

      if (m_opened <= 0)

         {

                  HIKS_Destroy(m_hSession);

                  m_hSession = -1;

                  m_opened = -1;

         }

         nRet=HIKS_Play(m_hSession);

         if(nRet != 1)

         {

      HIKS_Stop(m_hSession);

      m_hSession = -1;

           m_opened = -1;

         }

注意:

(1)選單欄Project-settings,選擇Link,新增client.lib 。在VC安裝目錄下,找到Include,新增client.h,clntsink.h;在Lib新增client.lib

(2)在debug編譯的clientTest.exe,新增client.cll,playm4.cll等檔案

流媒體二次開發 <wbr>-- <wbr>C++

   

 

 

相關文章