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,如需轉載請自行聯系原作者