亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

H264解碼學習-2015.04.16

2019-11-17 02:26:38
字體:
來源:轉載
供稿:網友

H264解碼學習-2015.04.16

  今天看了不少,卻感覺收獲寥寥。

  1、H264相關知識

  因為RTP協議發過來的數據已經經過了H264編碼,所以這邊需要解碼。補充一下H264的相關知識。

  與以往的視頻壓縮標準相比,H.264 視頻壓縮標準(簡稱H.264)具有更出色的性能,因此H.264 被稱為新一代視頻壓縮標準。H.264 與H.263 或MPEG-4 相比,       主要新增特性如下: 1、采用更為精細和豐富的幀內編碼及幀間預測方式,有效地減少殘差數據。 2、引入新的算術編碼方式,使得數據壓縮比更高。 3、視頻數據分層更為合理,引入 NAL 更利于網絡傳輸?! ?、取消傳統的幀結構,引入 slice 結構和參數集,提高碼流的抗誤碼能力?! ?、引入靈活的參考幀管理機制,參考幀數目最多可以達到 16 個。

  上述特性使得H.264 在視頻信噪比、圖像質量以及應用的靈活性上有了質的飛躍,但帶來的問題是H.264 在實現上復雜度較高。

  2、一些可能的解決方案(并未實踐)

  Intel media SDK,windows media sdk,http://www.ffmpeg-csharp.com/(這個網站上說是最簡單的方式使用ffmpeg,我也沒有學會怎么使用,等以后再回來學習吧),C#調用ffmpeg開發庫。以上這些方式只是搜索到的可能的解決方法,因為太懶了,著急做出東西,所以沒有去學習,后來在??档牟シ艓霢PI中看到H264的相關知識(http://www.49028c.com/over140/archive/2009/03/22/1418946.html),以前做??禂z像頭調用的時候就經??此牟┛?。最后在晚上的時候找到一種解決方式。使用海思提供的H264解碼庫,有專門的解碼庫,但也是用C++寫的。不過這沒有問題,想起以前??禂z像頭的時候也是C++的代碼,通過C#來調用。方法是通過PInvoke.net轉一下就可以了。

  轉換之后的代碼,將hi_h264dec_w.dll轉換為C#中的類(也是參考網上的代碼)

class Hi264Dec    {         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, ref hiH264_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);          [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);          [StructLayout(LayoutKind.Sequential)]         public struct hiH264_DEC_ATTR_S         {             public uint uPictureFormat;             public uint uStreamInType;             public uint uPicWidthInMB;             public uint uPicHeightInMB;             public uint uBufNum;             public uint uWorkMode;             public IntPtr pUserData;             public uint uReserved;         }          [StructLayout(LayoutKind.Sequential)]         public struct hiH264_DEC_FRAME_S         {             public IntPtr pY;             public IntPtr pU;             public IntPtr pV;             public uint uWidth;             public uint uHeight;             public uint uYStride;             public uint uUVStride;             public uint uCroppingLeftOffset;             public uint uCroppingRightOffset;             public uint uCroppingTopOffset;             public uint uCroppingBottomOffset;             public uint uDpbIdx;             public uint uPicFlag;             public uint bError;             public uint bIntra;             public ulong ullPTS;             public uint uPictureID;             public uint uReserved;             public IntPtr pUserData;         }          [StructLayout(LayoutKind.Sequential)]         public struct hiH264_LIBINFO_S         {             public uint uMajor;             public uint uMinor;             public uint uRelease;             public uint uBuild;             [MarshalAs(UnmanagedType.LPStr)] public string sVersion;             [MarshalAs(UnmanagedType.LPStr)] public string sCopyRight;             public uint uFunctionSet;             public uint uPictureFormat;             public uint uStreamInType;             public uint uPicWidth;             public uint uPicHeight;             public uint uBufNum;             public uint uReserved;         }          [StructLayout(LayoutKind.Sequential)]         public struct hiH264_USERDATA_S         {             public uint uUserDataType;             public uint uUserDataSize;             public IntPtr pData;             public IntPtr pNext;         }    }

    可以在窗體加載的時候加載如下代碼

//初始化,可以在 FormLoad 事務里完成             var decAttr = new Hi264Dec.hiH264_DEC_ATTR_S();             decAttr.uPictureFormat = 0;             decAttr.uStreamInType = 0;             decAttr.uPicWidthInMB = 480 >> 4;             decAttr.uPicHeightInMB = 640 >> 4;             decAttr.uBufNum = 8;             decAttr.uWorkMode = 16;             IntPtr _decHandle = Hi264Dec.Hi264DecCreate(ref decAttr);              Hi264Dec.hiH264_DEC_FRAME_S _decodeFrame = new Hi264Dec.hiH264_DEC_FRAME_S();             //解碼             //pData 為須要解碼的 H264 nalu 數據,length 為該數據的長度             if (Hi264Dec.Hi264DecAU(_decHandle, pData, (uint) length, 0, ref _decodeFrame, 0) == 0)             {                 if (_decodeFrame.bError == 0)                 {                     //策畫 y u v 的長度                     var yLength = _decodeFrame.uHeight * _decodeFrame.uYStride;                     var uLength = _decodeFrame.uHeight * _decodeFrame.uUVStride / 2;                     var vLength = uLength;                     var yBytes = new byte[yLength];                     var uBytes = new byte[uLength];                     var vBytes = new byte[vLength];                     var decodedBytes = new byte[yLength + uLength + vLength];                     //_decodeFrame 是解碼后的數據對象,里面包含 YUV 數據、寬度、高度等信息                     Marshal.Copy(_decodeFrame.pY, yBytes, 0, (int)yLength);                     Marshal.Copy(_decodeFrame.pU, uBytes, 0, (int)uLength);                     Marshal.Copy(_decodeFrame.pV, vBytes, 0, (int)vLength);                     //將從 _decodeFrame 中取出的 YUV 數據放入 decodedBytes 中                     Array.Copy(yBytes, decodedBytes, yLength);                     Array.Copy(uBytes, 0, decodedBytes, yLength, uLength);                     Array.Copy(vBytes, 0, decodedBytes, yLength + uLength, vLength);                     //decodedBytes 為yuv數據,可以將其轉換為 RGB 數據后再轉換為 BitMap 然后經由過程 PictureBox 控件即可顯示                     //這類代碼網上斗勁常見,我就不貼了     }

    在關閉的時候銷毀解碼器句柄

  

Hi264Dec.Hi264DecDestroy(_decHandle);

    在上面也說了,傳進來的數據轉為YUV數據后,還需要轉為RGB,再轉為圖片在控件中進行顯示。粗略從網上看了一下,這類算法還是比較多的,所以明天的目標是將視頻顯示出來。爭取讓已有的輪子跑起來。

    3、C++學習

    今天上午還看了一小部分C++,看的比較慢,學習了基本的輸入輸出語句,只看到第28頁。

    4、總結

    今天收畢業論文題目了,我還沒怎么開始寫呢。等把RTP和H264視頻解碼這一塊解決就開始準備畢業論文了。晚上的時候給周兆熊老師發的郵件已經收到回復。對于我自己目前的問題也總結一下:(1)語言的確沒什么再糾結的意思了,對我現在來說沒有孰優孰劣,我需要的做的是盡量用熟悉的語言去解決現在存在的問題。(2)未來想找工作的話不單單需要專業方面的知識,也需要軟實力,想起前幾天犯得小錯誤,對自己的成長還是有幫助。需要繼續看書,讀過的書也需要做筆記。(3)關于怎么讓自己堅持去學習,前幾天的煩躁心里真的因為好好做事情減輕了呢。這幾天一直嘗試著用番茄工作法讓自己安定下來,堅持使用第四天,每天大約5個番茄鐘(效率好低啊)??戳烁咝Чぷ骱?,里面的對拖延癥的分析三個原因真的讓我印象深刻:(1)其他人強迫你做的事情違背你的意愿(好像的確如此哈哈);(2)你給自己壓力要有完美的表現;(3)害怕犯錯誤受批評。三個原因真的是非常準確。不愉快也因為忙碌起來而漸漸消失了。

    5、現在所學的很多東西真的是流于表面,即使我把這個視頻解碼做出來已經能播放了,但我還是覺得自己的提升好少。但我還是要繼續這樣做,時間緊迫。不知道我寫的東西對您有沒有幫助,希望各位懂這方面的我們多多交流。對于我的建議給在評論中提出,謝謝您對我的提議。每天記錄一點點,就能進步一點點。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕欧美专区| 国产视频999| 国产亚洲日本欧美韩国| 97碰碰碰免费色视频| 久久理论片午夜琪琪电影网| 日韩精品丝袜在线| 91av视频在线免费观看| 国产91网红主播在线观看| 91国产视频在线播放| 亚洲精品一区中文字幕乱码| 97视频在线免费观看| 欧美午夜片欧美片在线观看| 亚洲伊人久久大香线蕉av| 国产欧美精品一区二区| 亚洲精品网址在线观看| 黑人精品xxx一区| 国产日韩精品在线观看| 青草青草久热精品视频在线观看| 国产精品嫩草视频| 成人黄色免费网站在线观看| 国产福利精品在线| 精品久久久一区| 国产玖玖精品视频| 色樱桃影院亚洲精品影院| 欧美黑人xxxx| 在线精品视频视频中文字幕| 午夜伦理精品一区| 亚洲最大的免费| 国产精品一区二区三区在线播放| 欧美理论在线观看| 97久久精品人人澡人人爽缅北| 美女扒开尿口让男人操亚洲视频网站| 国产亚洲免费的视频看| 国产精品96久久久久久| 这里只有精品视频在线| 国产欧美一区二区三区久久人妖| 国产精品美女在线| 亚洲最大的网站| 精品久久久久久久久久久久久久| 日韩精品一区二区三区第95| 日韩黄色高清视频| 97碰碰碰免费色视频| 91av在线播放视频| 国产日韩中文字幕在线| 日韩电影在线观看中文字幕| 国产精品揄拍一区二区| 国产精品久久久久久久久免费看| 91精品视频一区| 国产一区二区免费| 欧美中文字幕精品| 日韩精品久久久久久福利| 亚洲欧洲日韩国产| 伊人青青综合网站| 久久久久久久久久久国产| 亚洲激情视频网| 98精品在线视频| 91av网站在线播放| 国产日韩欧美黄色| 国产视频久久网| 欧美性69xxxx肥| 精品视频久久久久久久| 欧美与黑人午夜性猛交久久久| 亚洲电影免费观看| 成人福利网站在线观看11| 日韩在线观看免费全| 成人免费在线视频网站| 日韩欧美在线免费观看| 国产一区二区久久精品| 久久久欧美精品| 日本久久亚洲电影| 国产一区二区免费| 91精品视频免费观看| 激情成人在线视频| 正在播放欧美视频| 欧美激情一区二区三区高清视频| 亚州国产精品久久久| 国产精品免费在线免费| 欧美大奶子在线| 91久久精品日日躁夜夜躁国产| 日韩视频免费在线观看| 久久久久成人网| 狠狠做深爱婷婷久久综合一区| 福利微拍一区二区| 亚洲影院色在线观看免费| 国产亚洲免费的视频看| 国产成人精品一区二区三区| 91视频88av| 欧美日韩aaaa| 日韩欧美在线免费观看| 国产精品香蕉在线观看| 国产有码在线一区二区视频| 一本色道久久88精品综合| 欧美精品一区二区免费| 精品久久在线播放| 亚洲黄色www| 亚洲第一区在线| 日韩黄色av网站| 亚洲欧美国产va在线影院| 亚洲老板91色精品久久| 深夜精品寂寞黄网站在线观看| 中文字幕综合一区| 日韩精品在线观看网站| 欧美一级片久久久久久久| 亚洲精品视频在线观看视频| 亚洲精品日韩欧美| 日韩av一区二区在线观看| 欧美性猛交xxxx免费看漫画| 亚洲欧美国产另类| 欧美成人h版在线观看| 国产精品美女免费视频| 国产精品久久久久久久9999| 久久久久国产精品www| 国产一区二区三区在线免费观看| 国产精品高潮呻吟久久av无限| 成人有码视频在线播放| 国产盗摄xxxx视频xxx69| 高清视频欧美一级| 国产精品美女视频网站| 欧美性猛交xxxxx水多| 久久韩剧网电视剧| 在线不卡国产精品| 777国产偷窥盗摄精品视频| 在线观看久久久久久| 成人黄色在线免费| 成人免费观看49www在线观看| 欧美成人免费播放| 亚洲奶大毛多的老太婆| 国产成人综合精品| 日韩精品福利网站| 最近更新的2019中文字幕| 欧美色道久久88综合亚洲精品| 精品国产网站地址| 欧美国产高跟鞋裸体秀xxxhd| 欧美激情免费视频| 97精品在线观看| 高清欧美性猛交xxxx黑人猛交| 久久精品视频中文字幕| 久久久久成人网| 国产精品美乳一区二区免费| 日韩中文字幕在线精品| 国内精品400部情侣激情| 欧美日韩免费区域视频在线观看| 久久久精品免费| 欧洲s码亚洲m码精品一区| 亚洲第一免费播放区| 97热在线精品视频在线观看| 91影视免费在线观看| 国产精品视频不卡| 美女精品视频一区| 色综合伊人色综合网| 日韩美女av在线免费观看| 日韩av在线电影网| 精品视频久久久久久| 欧美成人精品在线| 琪琪第一精品导航| 亚洲精品一区在线观看香蕉| 福利精品视频在线| 97碰在线观看| 国产成人精品在线观看| 日韩高清免费观看| 亚洲社区在线观看| 国产欧美中文字幕| 亚洲综合精品一区二区| 孩xxxx性bbbb欧美|