海思的dll,解碼h264 解碼后轉出yuv12
dll自己百度下載 hi_h264dec.dll hi_h264dec_w.dll
調用方法:
if (H264Dec.Hi264DecAU(_decHandle, pH264Data, frameLen, 0, ref _decodeFrame, 0) == 0)
pH264Data是h264幀的句柄,frameLen是h264幀的長度,_decodeFrame是解碼后的yuv幀
#region 解碼器相關變量聲明 /// <summary> /// 數據的句柄 /// </summary> /// <summary> /// 這是解碼器屬性信息 /// </summary> public H264Dec.hiH264_DEC_ATTR_S decAttr; /// <summary> /// 這是解碼器輸出圖像信息 /// </summary> public H264Dec.hiH264_DEC_FRAME_S _decodeFrame = new H264Dec.hiH264_DEC_FRAME_S(); /// <summary> /// 解碼器句柄 /// </summary> public IntPtr _decHandle; static double[,] YUV2RGB_CONVERT_MATRIX = new double[3, 3] { { 1, 0, 1.4022 }, { 1, -0.3456, -0.7145 }, { 1, 1.771, 0 } }; #endregion #region 解碼器相關初始化,一般在窗口load中進行初始化 decAttr = new H264Dec.hiH264_DEC_ATTR_S(); decAttr.uPictureFormat = 0; decAttr.uStreamInType = 0; decAttr.uPicWidthInMB = (uint)width; decAttr.uPicHeightInMB = (uint)height; decAttr.uBufNum = 8; decAttr.uWorkMode = 16; //創建、初始化解碼器句柄 _decHandle = H264Dec.Hi264DecCreate(ref decAttr); #endregion using System; using System.Runtime.InteropServices; namespace FVD.Common { public class H264Dec { public const int HI_SUCCESS = 0; public const int HI_FAILURE = -1; public const int HI_LITTLE_ENDIAN = 1234; public const int HI_BIG_ENDIAN = 4321; public const int HI_DECODER_SLEEP_TIME = 60000; public const int HI_H264DEC_OK = 0; public const int HI_H264DEC_NEED_MORE_BITS = -1; public const int HI_H264DEC_NO_PICTURE = -2; public const int HI_H264DEC_ERR_HANDLE = -3; [DllImport("hi_h264dec_w.dll", EntryPoint = "Hi264DecImageEnhance",CallingConvention = CallingConvention.Cdecl)] public static extern int Hi264DecImageEnhance(IntPtr hDec, refhiH264_DEC_FRAME_S pDecFrame, uint uEnhanceCoeff); [DllImport("hi_h264dec_w.dll", EntryPoint = "Hi264DecCreate", CallingConvention =CallingConvention.Cdecl)] public static extern IntPtr Hi264DecCreate(ref hiH264_DEC_ATTR_S pDecAttr); [DllImport("hi_h264dec_w.dll", EntryPoint = "Hi264DecDestroy", CallingConvention =CallingConvention.Cdecl)] public static extern void Hi264DecDestroy(IntPtr hDec); [DllImport("hi_h264dec_w.dll", EntryPoint = "Hi264DecGetInfo", CallingConvention =CallingConvention.Cdecl)] public static extern int Hi264DecGetInfo(ref hiH264_LIBINFO_S pLibInfo); /// <summary> /// 對輸入的一段碼流進行解碼並按幀輸出圖像 /// </summary> /// <param name="hDec">解碼器句柄</param> /// <param name="pStream">碼流起始地址</param> /// <param name="iStreamLen">碼流長度</param> /// <param name="ullPTS">時間戳信息</param> /// <param name="pDecFrame">圖像信息</param> /// <param name="uFlags">解碼模式 0:正常解碼;1、解碼完畢並要求解碼器輸出殘留圖像</param> /// <returns></returns> [DllImport("hi_h264dec_w.dll", EntryPoint = "Hi264DecFrame", CallingConvention = CallingConvention.Cdecl)] public static extern int Hi264DecFrame(IntPtr hDec, IntPtr pStream, uint iStreamLen, ulong ullPTS, ref hiH264_DEC_FRAME_S pDecFrame, uint uFlags); [DllImport("hi_h264dec_w.dll", EntryPoint = "Hi264DecAU", CallingConvention =CallingConvention.Cdecl)] public static extern int Hi264DecAU(IntPtr hDec, IntPtr pStream, uint iStreamLen,ulong ullPTS, ref hiH264_DEC_FRAME_S pDecFrame, uint uFlags); /// <summary> /// 解碼器屬性信息。 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct hiH264_DEC_ATTR_S { /// <summary> /// 解碼器輸出圖像格式,目前解碼庫只支持YUV420圖像格式 /// </summary> public uint uPictureFormat; /// <summary> /// 輸入碼流格式 0x00: 目前解碼庫只支持以“00 00 01”為nalu分割符的流式H.264碼流 /// </summary> public uint uStreamInType; /// <summary> /// 圖像寬度 /// </summary> public uint uPicWidthInMB; /// <summary> /// 圖像高度 /// </summary> public uint uPicHeightInMB; /// <summary> /// 參考幀數目 /// </summary> public uint uBufNum; /// <summary> /// 解碼器工作模式 /// </summary> public uint uWorkMode; /// <summary> /// 用戶私有數據 /// </summary> public IntPtr pUserData; /// <summary> /// 保留字 /// </summary> public uint uReserved; } /// <summary> /// 解碼器輸出圖像信息數據結構 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct hiH264_DEC_FRAME_S { /// <summary> /// Y分量地址 /// </summary> public IntPtr pY; /// <summary> /// U分量地址 /// </summary> public IntPtr pU; /// <summary> /// V分量地址 /// </summary> public IntPtr pV; /// <summary> /// 圖像寬度(以像素為單位) /// </summary> public uint uWidth; /// <summary> /// 圖像高度(以像素為單位) /// </summary> public uint uHeight; /// <summary> /// 輸出Y分量的stride (以像素為單位) /// </summary> public uint uYStride; /// <summary> /// 輸出UV分量的stride (以像素為單位) /// </summary> public uint uUVStride; /// <summary> /// 圖像裁減信息:左邊界裁減像素數 /// </summary> public uint uCroppingLeftOffset; /// <summary> /// 圖像裁減信息:右邊界裁減像素數 /// </summary> public uint uCroppingRightOffset; /// <summary> /// 圖像裁減信息:上邊界裁減像素數 /// </summary> public uint uCroppingTopOffset; /// <summary> /// 圖像裁減信息:下邊界裁減像素數 /// </summary> public uint uCroppingBottomOffset; /// <summary> /// 輸出圖像在dpb中的序號 /// </summary> public uint uDpbIdx; /// <summary> /// 圖像類型:0:幀; 1:頂場; 2:底場 */ /// </summary> public uint uPicFlag; /// <summary> /// 圖像類型:0:幀; 1:頂場; 2:底場 */ /// </summary> public uint bError; /// <summary> /// 圖像是否為IDR幀:0:非IDR幀;1:IDR幀 /// </summary> public uint bIntra; /// <summary> /// 時間戳 /// </summary> public ulong ullPTS; /// <summary> /// 圖像信號 /// </summary> public uint uPictureID; /// <summary> /// 保留字 /// </summary> public uint uReserved; /// <summary> /// 指向用戶私有數據 /// </summary> public IntPtr pUserData; } /// <summary> /// 解碼庫版本、版權和能力集信息。 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct hiH264_LIBINFO_S { /// <summary> /// 主編號 /// </summary> public uint uMajor; /// <summary> /// 次編號 /// </summary> public uint uMinor; /// <summary> /// 發布編號 /// </summary> public uint uRelease; /// <summary> /// 建構編號 /// </summary> public uint uBuild; /// <summary> /// 版本信息 /// </summary> [MarshalAs(UnmanagedType.LPStr)] public string sVersion; /// <summary> /// 版權信息 /// </summary> [MarshalAs(UnmanagedType.LPStr)] public string sCopyRight; /// <summary> /// 解碼庫能力集 /// </summary> public uint uFunctionSet; /// <summary> /// 支持的輸出圖像格式 /// </summary> public uint uPictureFormat; /// <summary> /// 輸入碼流格式 /// </summary> public uint uStreamInType; /// <summary> /// 最大圖像寬度(以像素為單位) /// </summary> public uint uPicWidth; /// <summary> /// 最大圖像高度(以像素為單位) /// </summary> public uint uPicHeight; /// <summary> /// 最大參考幀數目 /// </summary> public uint uBufNum; /// <summary> /// 保留字 /// </summary> public uint uReserved; } /// <summary> /// 用戶私有數據信息。 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct hiH264_USERDATA_S { /// <summary> /// 用戶數據類型 /// </summary> public uint uUserDataType; /// <summary> /// 用戶數據長度 /// </summary> public uint uUserDataSize; /// <summary> /// 用戶數據緩沖區 /// </summary> public IntPtr pData; /// <summary> /// 指向下一段用戶數據 /// </summary> public IntPtr pNext; } } }