天天看點

C# 視訊監控系列(7):伺服器端——封裝API(下)(4)

 public static extern int SetIBPMode(IntPtr hChannelHandle, int KeyFrameIntervals, int BFrames, int PFrames, int FrameRate);

        #region 3.4.4.3設定編碼分辨率

        /// <summary>

        /// 3.4.4.3.1設定主通道分辨率SetEncoderPictureFormat

        ///     說 明:  設定主通道編碼分辨率。支援動态修改。

        /// 

        /// int __stdcall SetEncoderPictureFormat(HANDLE hChannelHandle,  PictureFormat_t PictureFormat) 

        /// </summary>

        /// <param name="hChannelHandle">通道句柄</param>

        /// <param name="PictureFormat">編碼圖像分辨率(4CIF、DCIF、2CIF、CIF、QCIF) </param>

        /// <returns>成功傳回0;失敗傳回錯誤号</returns>

        [DllImport("DS40xxSDK.dll")]

        public static extern int SetEncoderPictureFormat(IntPtr hChannelHandle, PictureFormat_t PictureFormat);

        /// 3.4.4.3.2設定子通道編碼分辨率SetSubEncoderPictureFormat

        ///     說 明:  設定雙編碼模式時子通道的編碼分辨率,支援動态修改。

        /// int __stdcall SetSubEncoderPictureFormat(HANDLE hChannelHandle,  PictureFormat_t PictureFormat) 

        /// <param name="hChannelHandle">子通道句柄</param>

        /// <param name="PictureFormat">子通道編碼圖像分辨率(4CIF、DCIF、2CIF、CIF、 QCIF) </param>

        public static extern int SetSubEncoderPictureFormat(IntPtr hChannelHandle, PictureFormat_t PictureFormat);

        #endregion

        #region 3.4.4.4設定碼率及碼流控制模式

        /// 3.4.4.4.1設定碼流最大比特率SetupBitrateControl 

        ///     說 明:  設定編碼的最大比特率。設定為0時碼流控制無效,設定為某一最大比特率時,

        ///     當編碼碼流超過該值時,DSP會自動調整編碼參數來保證不超過最大比特率,當編碼碼流

        ///     低于最大比特率時,DSP不進行幹涉。調整誤差<10%

        /// int __stdcall SetupBitrateControl(HANDLE hChannelHandle, ULONG MaxBps) 

        /// <param name="MaxBps">最大比特率。取值:10000以上</param>

        public static extern int SetupBitrateControl(IntPtr hChannelHandle, ulong MaxBps);

        /// 3.4.4.4.2設定碼流控制方式SetBitrateControlMode

        ///     說 明:   設定編碼碼流控制方式。配合SetupBitrateControl使用。當設定為變碼率(brVBR) 

        ///     時,最大比特率将作為編碼碼流上限,由DSP在碼流上限下自動控制碼率,一般會自動回

        ///     落到最低的狀态(由設定的圖像品質參數和關鍵幀間隔決定),能最大程度地降低帶寬和存

        ///     儲空間,但存儲容量一般難以估算;當設定為定碼率(brCBR)時,以最大比特率作為編碼

        ///     碼率參數恒定輸出碼流,不會自動回落到低碼流狀态,存儲容量可根據設定碼率的大小進行估算。

        /// int __stdcall SetBitrateControlMode(HANDLE hChannelHandle, BitrateControlType_t brc) 

        /// <param name="brc">碼流控制方式,分為變碼率(brVBR)和恒定碼率 (brCBR)兩種方式 </param>

        public static extern int SetBitrateControlMode(IntPtr hChannelHandle, BitrateControlType_t brc);

        /// 3.4.5強制設定I幀CaptureIFrame

        ///     說 明:  将目前編碼幀強制設定為I幀模式,可從碼流中提取該幀單獨用于網絡傳送。

        /// int __stdcall CaptureIFrame(HANDLE hChannelHandle)

        public static extern int CaptureIFrame(IntPtr hChannelHandle);

        /// 3.4.6擷取幀統計資訊GetFramesStatistics

        ///     說 明:  擷取幀統計資訊

        /// int __stdcall GetFramesStatistics(HANDLE hChannelHandle,PFRAMES_STATISTICS framesStatistics) 

        /// <param name="framesStatistics">幀統計資訊</param>

        public static extern int GetFramesStatistics(IntPtr hChannelHandle, PFRAMES_STATISTICS framesStatistics);

        #region 3.5資料捕獲

        #region 3.5.1抓圖(擷取單幀圖像資料)

        #region 3.5.1.1抓取BMP格式圖像

        /// 3.5.1.1.1擷取原始yuv422格式資料GetOriginalImage

        ///     說 明:  獲得原始yuv422格式圖像,DS4000HC原始圖像是4CIF圖像格式(包括QCIF編碼),

        ///     DS-4000HS原始圖像為CIF圖像格式,DS400xH卡的原始圖象是CIF圖象格式。

        /// int __stdcall GetOriginalImage(HANDLE hChannelHandle, UCHAR *ImageBuf,  ULONG *Size) 

        /// <param name="ImageBuf">原始yuv422格式圖像指針</param>

        /// <param name="Size">原始yuv422格式圖像尺寸,函數調用前是ImageBuf的大小,調用後是實際圖像所占用的位元組數 </param>

        /// <returns>成功傳回0,失敗傳回錯誤号</returns>

        public static extern int GetOriginalImage(IntPtr hChannelHandle, byte[] ImageBuf, out int Size);

        /// 3.5.1.1.2圖像格式轉換YUVtoBMP SaveYUVToBmpFile

        ///     說 明:  使用者程式可調用此函數來生成24位的bmp檔案,如果是DS4000HC卡抓圖則

        ///     Width 為704,Height 為576PAL/480NTSC,如果是DS400xH卡抓圖則Width可能為352 

        ///     或176,Height為288、240、144或120,要根據緩沖區的大小來判斷。

        /// int __stdcall SaveYUVToBmpFile(char *FileName, unsigned char *yuv, int Width, int Height) 

        /// <param name="FileName">檔案名</param>

        /// <param name="yuv">yuv422格式圖像指針</param>

        /// <param name="Width">圖像寬度</param>

        /// <param name="Height">圖像高度</param>

        /// <returns></returns>

        public static extern int SaveYUVToBmpFile(string FileName, byte[] yuv, int Width, int Height);

        /// 3.5.1.2抓取JPEG格式圖像GetJpegImage

        ///     說 明:  抓取JPEG格式圖像

        /// int __stdcall GetJpegImage(HANDLE hChannelHandle,UCHAR *ImageBuf, ULONG *Size,UINT nQuality) 

        /// <param name="ImageBuf">JPEG圖像指針</param>

        /// <param name="Size">JPEG圖像尺寸,函數調用前是ImageBuf的大小,調用後是實際圖像所占用的位元組數 </param>

        /// <param name="nQuality">JPEG圖像品質,取值範圍1-100,取值100時品質最好</param>

        public static extern int GetJpegImage(IntPtr hChannelHandle, byte[] ImageBuf, out int Size, uint nQuality);

        #region 3.5.2原始圖像資料流捕獲(擷取YUV420格式資料流)

        /// 3.5.2.1注冊原始圖像資料流回調函數RegisterImageStreamCallback

        ///     說 明:  注冊擷取原始圖像資料流函數,使用者可以擷取實時的YUV420格式的預覽資料

        /// int __stdcall RegisterImageStreamCallback (IMAGE_STREAM_CALLBACK ImageStreamCallback,void *context) 

        /// <param name="ImageStreamCallback">原始圖像資料流回調函數 </param>

        /// <param name="context">裝置上下文</param>

        public static extern int RegisterImageStreamCallback(IMAGE_STREAM_CALLBACK ImageStreamCallback, IntPtr context);

        /// 3.5.2.2開啟及停止原始資料流捕獲SetImageStream

        ///     說明:    開啟或停止原始圖像資料流捕獲,此函數依賴主機的處理速度。DS-4000HS隻能捕獲不大于CIF格式的資料流

        /// 函 數:  int __stdcall SetImageStream(HANDLE hChannel,BOOL bStart,UINT fps, UINT width,UINT height,unsigned char *imageBuffer) 

        /// <param name="hChannel">通道句柄</param>

        /// <param name="bStart">是否啟動捕獲</param>

        /// <param name="fps">幀率</param>

        /// <param name="width">圖像寬度,必須是4CIF寬度的1/8,1/4,1/2或原始大小704</param>

        /// <param name="height">圖象高度,必須是4CIF高度的1/8,1/4,1/2或原始大小576PAL/480NTSC</param>

        /// <param name="imageBuffer">資料存儲緩存</param>

        public static extern int SetImageStream(IntPtr hChannel, bool bStart, uint fps, uint width, uint height, char[] imageBuffer);

        #region 3.5.3編碼資料流捕獲(擷取編碼後H.264格式資料流)即錄像

        //注意:注冊直接回調或者消息回調後,需要啟動編碼資料流捕獲函數才能進行資料回調。三

        //種資料回調方式,隻需選取其中一種使用即可。對于HC系列闆卡(包括HC、HC+、HCS、

        //HS),推薦使用第一種讀取方式。對于H系列闆卡,隻能使用後兩種讀取方式。

        #region 3.5.3.1編碼資料流捕獲方式設定

        /// 3.5.3.1.1.1注冊編碼圖像資料流直接讀取回調函數

        ///     說 明:  DS4000HC系列闆卡新增的一種資料流讀取方式,當啟動資料捕獲後,   

        ///     StreamDirectReadCallback會提供資料流的位址、長度、幀類型等,供使用者程式直接處理。

        /// 函 數:  int __stdcall RegisterStreamDirectReadCallback (STREAM_DIRECT_READ_CALLBACK StreamDirectReadCallback,void *Context) 

        /// <param name="StreamDirectReadCallback">編碼資料流直接讀取回調函數</param>

        public static extern int RegisterStreamDirectReadCallback(STREAM_DIRECT_READ_CALLBACK StreamDirectReadCallback, IntPtr context);

        #region 3.5.3.1.2方式二、消息讀取方式

        /// 3.5.3.1.2.1設定消息讀取伐值,此函數隻對H卡有效

        ///     說 明:  設定消息讀取的伐值,可以将緩沖區的資料在OnDataReady中一次性取走

        /// int __stdcall SetupNotifyThreshold(HANDLE hChannelHandle,  int iFramesThreshold) 

        /// <param name="iFramesThreshold">讀取消息伐值,範圍1-10</param>

        public static extern int SetupNotifyThreshold(IntPtr hChannelHandle, int iFramesThreshold);

        /// 3.5.3.1.2.2注冊消息讀取碼流函數

        ///     說 明:  當資料準備好時,SDK會向hWnd視窗發送MessageId消息,目标視窗收到

        ///     Message後調用ReadStreamData讀取一幀資料。如果HC卡與H卡混插,可以先調用 

        ///     RegisterStreamDirectReadCallback函數來注冊HC卡取碼流回調函數,再調用

        ///     RegisterMessageNotifyHandle函數來注冊H卡取碼流消息函數。

        ///     HC系列闆卡建議使用方式一進行資料捕獲。 

        /// int __stdcall RegisterMessageNotifyHandle(HWND hWnd, UINT MessageId)

        /// <param name="hWnd">通道句柄</param>

        /// <param name="MessageId">自定義消息</param>

        /// <returns>成功傳回0;失敗傳回錯誤号 </returns>

        public static extern int RegisterMessageNotifyHandle(IntPtr hWnd, uint MessageId);

        #region 3.5.3.1.3方式三、另一種直接讀取方式

        /// 3.5.3.1.3.1注冊直接讀取碼流回調函數

        ///     說 明:  另一種資料流讀取方式

        /// int __stdcall RegisterStreamReadCallback (STREAM_READ_CALLBACK StreamReadCallback, void *Context) 

        /// <param name="StreamReadCallback">直接讀取碼流回調函數</param>

        /// <param name="Context">裝置上下文</param>

        public static extern int RegisterStreamReadCallback(STREAM_READ_CALLBACK StreamReadCallback, IntPtr Context);

        /// 3.5.3.2讀取碼流函數

        ///     說 明:  讀指定長度的資料流,适用于方式二及方式三。當調用StartVideoCapture 或

        ///     StartMotionDetection後,SDK線程會向已注冊的使用者視窗消息處理函數發送指定的消息,

        ///     并提供消息來源的通道号。當使用者程式收到該消息時,可調用本函數來讀取資料,Length 在

        ///     作為輸入時必須提供緩沖的大小,ReadStreamData會判斷緩沖是否足夠,如果緩沖足夠大

        ///     則傳回值為目前的讀取的幀長度,否則傳回錯誤。

        ///         在HC卡中,如果已經先調用了RegisterStreamDirectReadCallback()函數,則不需調用 

        ///     ReadStreamData來讀取資料,因為音視訊資料會在RegisterStreamDirectReadCallback所注冊

        ///     的回調函數中直接傳回。

        /// int __stdcall ReadStreamData(HANDLE hChannelHandle, void *DataBuf,  DWORD *Length, int *FrameType) 

        /// <param name="DataBuf">自定義的資料緩存區</param>

        /// <param name="Length">輸入:緩存區的大小;輸出:一幀資料的大小</param>

        /// <param name="FrameType">幀類型</param>

        public static extern int ReadStreamData(IntPtr hChannelHandle, byte[] DataBuf, out ulong Length, out int FrameType);

        #region 3.5.3.3開啟及停止錄像

        /// 3.5.3.3.1啟動主通道編碼資料流捕獲

        ///     說 明:  啟動主通道編碼資料流捕獲。使用者程式可以使用直接讀取方式,使用

        ///     StreamDirectReadCallback回調函數直接對資料流進行處理;也可以與H卡一樣,通過消息

        ///     讀取方式,等SDK向使用者程式發送在RegisterMessageNotifyHandle中注冊的消息,使用者程

        ///     序使用ReadStreamData來讀取資料流。

        /// int __stdcall StartVideoCapture(HANDLE hChannelHandle) 

        public static extern int StartVideoCapture(IntPtr hChannelHandle);

        /// 3.5.3.3.2停止主通道編碼資料流捕獲

        ///     說 明:  停止主通道編碼資料流捕獲

        /// int __stdcall StopVideoCapture(HANDLE hChannelHandle)

        public static extern int StopVideoCapture(IntPtr hChannelHandle);

        /// 3.5.3.3.3啟動子通道編碼資料流捕獲

        ///     說 明:  啟動子通道編碼資料流捕獲 

        /// int __stdcall StartSubVideoCapture(HANDLE hChannelHandle)

        public static extern int StartSubVideoCapture(IntPtr hChannelHandle);

        /// 3.5.3.3.4停止子通道編碼資料流捕獲

        ///     說 明:  停止子通道編碼資料流捕獲

        /// int __stdcall StopSubVideoCapture(HANDLE hChannelHandle) 

        public static extern int StopSubVideoCapture(IntPtr hChannelHandle);

        #region 3.6移動偵測

        //        釋 義: 移動偵測 

        //DS4000HC提供運動強度資訊來處理運動檢測,設定移動偵測區域時以32*32像素塊為

        //機關,按4CIF(704*576)分辨率計算,每行有22個塊(704/32),PAL時18行(576/32),

        //NTSC時15行(480/32),與編碼格式無關。經過測試,這種方法比H卡提高了靈敏度和可

        //靠性,并簡化了傳回的資料,傳回的值是18個DWORD,對應螢幕高度576/32=18行(PAL),

        //每個DWORD的0-21位對應螢幕寬度704/32=22, 其中1為運動,0為靜止,也可以調用原有

        //MotionAnalyzer分析結果 

        //4.0版本的SDK新增了接口函數SetupMotionDetectionEx,提供了更靈活的功能,并且

        //簡化了使用者的工作量。 

        #region 3.6.1設定方式一

        //        設定移動偵測相關參數并啟動移動偵測後,運動檢測資訊會通過資料流傳送,使用者程式

        //發現PktMotionDetection幀類型時,可調用MotionAnalyzer來處理運動資訊,結果由

        //MotionAnalyzer在iResult中傳回。也可以按照SDK提供的資料格式來自己分析,運動資訊格

        //式參見移動偵測釋義。 

        /// 3.6.1.1設定移動偵測靈敏度

        ///     說 明:  調整運動分析的靈敏度,支援動态調整,此函數決定DSP全局運動分析的靈敏度。

        ///     而MotionAnalyzer的iThreshold則主要用于分析指定區域的運動統計結果。

        /// int __stdcall AdjustMotionDetectPrecision(HANDLE hChannelHandle, int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps) 

        /// <param name="iGrade">

        ///     運動分析靈敏度等級,取值範圍0-6,0級最靈敏,6級最遲鈍,推薦值為2。

        ///     将iGrade和“0x80000000“做”或“操作,會對移動偵測啟用自适應分析。

        /// </param>

        /// <param name="iFastMotionDetectFps">高速運動檢測的幀間隔,取值範圍0-12,0表示不作高速運動檢測,通常值取為2</param>

        /// <param name="iSlowMotionDetectFps">低速運動檢測的幀間隔,取值範圍13以上,當取值為0時,不作低速運動檢測</param>

        public static extern int AdjustMotionDetectPrecision(IntPtr hChannelHandle, int iGrade, int iFastMotionDetectFps, int iSlowMotionDetectFps);

本文轉自over140 51CTO部落格,原文連結:http://blog.51cto.com/over140/586683,如需轉載請自行聯系原作者

繼續閱讀