<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    h264檢測是I幀還是P幀,解決錄像第一幀有馬賽克問題

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    最近使用h264碼流數據進行錄像,但是錄出來的第一幀有馬賽克,究其原因是錄像的第一幀不是關鍵幀,所以需要錄像是需要判斷第一幀是否是關鍵幀,方法有兩種,第一種是原碼流的基礎上查找,第二種是將原碼流傳遞給ffmpeg讓ffmpeg判斷key_frame,第二種相對簡單,但是由于這樣一來錄像和解碼視頻切合的太緊密,之后修改比較麻煩,所以選擇第一種方案,查看注釋1可以明白如何檢測h264碼流的關鍵幀,下面是我截取原碼流的關鍵幀和p幀

     

    0000000 :是sps

    0000000  :  是pps

    0000000  : 是幀類型

    關鍵幀類型:

     

    [cpp] view plaincopy  
    1. <span style="color:#FF0000;"><span style="font-size:24px;">0000000: <span style="color:#CCCCCC;">0000 0001 6742 401f 9654 0501 ed00 f39e  ....gB@..T......  
    2. 0000010: a</span><span style="color:#3366FF;">000 0000 0168 ce38 80</span>00 0000 01<span style="color:#000000;">65</span> 8880  .....h.8.....e..  
    3. 0000020: 4001 8231 2000 4f11 d84d 5fff fb3b c28a  @..1 .O..M_..;..  
    4. 0000030: 00bc fc83 03db b3e3 8603 9c59 fa0f a82c  ...........Y...,  
    5. 0000040: df55 fdf6 8414 032a e766 bd4b fbea 05af  .U.....*.f.K....</span>  
    6. </span>  



     

    P幀類型:

     

    [cpp] view plaincopy  
    1. 0000000: <span style="color:#C0C0C0;">0000 0001 6742 401f 9654 0501 ed00 f39e  ....gB@..T......  
    2. 0000010: a</span><span style="color:#3366FF;">000 0000 0168 ce38 80</span>00 0000 01<span style="color:#000000;">41</span> 9a02  .....h.8.....A..  
    3. 0000020: 0586 7cb9 9125 5788 8f90 7f1f 1930 7eef  ..|..%W......0~.  
    4. 0000030: 6383 bebd 2cc5 3627 92c3 390b 46dc d4a5  c...,.6'..9.F...  
    5. 0000040: 774b 3484 57f8 9840 fba3 1dd6 800f 2242  wK4.W..@......"B  
    6. 0000050: 8816 080f 8f8d 84c6 09aa cda6 363d 00da  ............6=..  
    7. 0000060: b563 4392 bc65 93e2 63bb 6d30 472e 3ef1  .cC..e..c.m0G.>.  
    8. 0000070: 545d 6a3f 36c3 2f7d 6b1e 3c91 d15d d687  T]j?6./}k.<..]..  


    所以在代碼中需要檢索第29個字節,來判斷是65還是41,

     

     

    [python] view plaincopy  
    1. public static String byteToHexString(byte src){     
    2.         StringBuilder stringBuilder = new StringBuilder("");     
    3.             int v = src & 0xFF;     
    4.             String hv = Integer.toHexString(v);    
    5.             if (hv.length() < 2) {     
    6.                 stringBuilder.append(0);   
    7.             }     
    8.             stringBuilder.append(hv);  
    9.         return stringBuilder.toString();     
    10.     }     
    11. private boolean isFirstIFrame = true;  
    12. private String IFrame = "65";//關鍵幀是0x65  
    13. //<span style="font-size:16px"></span>bArrayImage是存放h264原碼流字節數組  
    14. if (是在錄像) {  
    15.                 if (isFirstIFrame) {  
    16.                     String type = byteToHexString(bArrayImage[29]);  
    17.                     if (type.equals(IFrame)) {    //第29個字符是判斷幀的類型  
    18.                         isFirstIFrame = false;  
    19.                         ShootingVideoData(bArrayImage, Video_Data_iVideoLen);//錄制第一幀:關鍵幀  
    20.                     }  
    21.                 }else {  
    22.                     ShootingVideoData(bArrayImage, Video_Data_iVideoLen);  
    23.                 }  
    24.             }  

    這樣在錄制出的第一幀錄像就沒有馬賽克了。

     

    注釋1:檢測h264中I幀,P幀

    原文鏈接:http://blog.csdn.net/zgyulongfei/article/details/7558031

    今天在網上找了一些資料,知道了如何檢測h264中的幀類型,在這里記錄下來。

    首先,貼出nal單元類型定義(圖從《新一代視頻壓縮編碼標準H.264》摘錄):

    RFID設備管理軟件

     

    假設一段h264的碼流為:00 00 00 01 41 E6 60……

    其中的00 00 00 01為起始碼,而起始碼之后的下一個字節就可以檢測出這一幀的類型。

    在上面的碼流中起始碼之后的字節位 0x41,換算成二進制為 0100 0001。

    注:我解讀順序為從左往右算。

    (1)第1位禁止位,值為1表示語法出錯

    (2)第2~3位為參考級別

    (3)第4~8為是nal單元類型,在此處為 0 0001換算成十進制為1。根據上圖可知道這段碼流是【不分區、非IDR圖像的片】,在baseline的檔次中就是P幀,因為baseline沒有B幀。

    如果是另一段碼流:00 00 00 01 65 E8……

    那么根據0x65字節(0110 0101)根據后5位換算十進制為5,也就是【IDR圖像中的片】,即I幀。

     

    用代碼的方式可以這樣寫,int type = 0x65 & 0x1f,然后根據type在表中查找即可獲得需要的結果。

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全