zoukankan      html  css  js  c++  java
  • 多媒体开发之---如何确定slice_header slice_type 的位置


      引用网友的问答:我找到0x000001 NAL的开头了,请问如何确定slice head的位置,继而得出slice_type呢?Nal unit后紧跟的就是slice head吗?标准里的循环让人看得有点迷茫,求大神指导Q1024440466

    h264 slice head slice_type NAL
     
     
    1.
      slice head位置紧跟NAL UNIT头后面(图像帧才有slice),slice_type及其前面的字段是变长的,需要根据哥伦布编码解码得出。
    2.  h264 i p b帧识别
    能从ts流中提取每个I帧,并且能识别I帧是否完整

    初步想法:
    .找帧起始位置所在的ts包
    找视频PID包,其中 Packet_start_code_prefix==0x000001 && stream_id==0xE0
    .判别帧类型
    在这个PES视频包负载中 找nal起始标志 0x000001
    找到后,然后获取Nal_unit_type
    Nal_unit_type等于5为IDR帧(在网上查找IDR帧属于I帧的子集),怎么判别I,P, B帧
    .IPB帧(slice)是可以找到的,但完整性是无法验证的。要参考H264标准文档,先查找 00 00 00 01 xx,code = xx & 0x1f,当code=1或5时为帧头,然后通过UExpGolomb方法计算first_mb_in_slice和slice_type,slice_type就是帧类型,
    3.
    这个问题要说清楚还是有点复杂:首先判断 NALU 类型是否是 5,如果是,那么以后连续出现的 NALU 类型为 5 的 NALU 就属于 IDR 帧(一种特殊的 I 帧);如果 NALU 不是 5,则要进一步判断 slice_type 是否是 7,如果是,那么连续出现的 slice_type = 7 的 slice 就属于 I 帧;如果 slice_type = 2,那么就要判断与当前 slice 同属一帧的 slice 是否都是 I slice,如果都是,那么这些 slice 就属于一个 I 帧。当然这必须是在码流没有错误的情况下才可行。

    实际应用中,码流中一般不会出现复杂的情况,所以可以直接判断 slice_type   是否等于 2 或 7 就可以了。http://blog.chinaunix.net/uid-12782-id-2915875.html
    4.

    直接给你代码吧 :)

    ////////////////////////////////////////////////////////////////////////// 
    // H.264 NAL type 
    enum H264NALTYPE{ 
    H264NT_NAL = 0, 
    H264NT_SLICE, 
    H264NT_SLICE_DPA, 
    H264NT_SLICE_DPB, 
    H264NT_SLICE_DPC, 
    H264NT_SLICE_IDR, 
    H264NT_SEI, 
    H264NT_SPS, 
    H264NT_PPS, 
    }; 
    int H264GetNALType(LPVOID pBSBuf, const LONG nBSLen) 

    if ( nBSLen < 5 )  // 不完整的NAL单元 
    return H264NT_NAL;

    UINT8* pBS = (UINT8 *)pBSBuf; 
    ULONG nType = pBS[4] & 0×1F;  // NAL类型在固定的位置上 :) 
    if ( nType <= H264NT_PPS ) 
    return nType;

    return 0; 
    }

    其中 H264NT_SLICE_IDR 是关键帧,H264NT_SLICE 是P帧

    一个frame是可以分割成多个Slice来编码的,而一个Slice编码之后被打包进一个NAL单元,不过NAL单元除了容纳Slice编码的码流外,还可以容纳其他数据,比如序列参数集SPS。

    5.

    http://blog.csdn.net/xfding/article/details/5476663

      slice_header

      slice_header( ) {  
        // first_mb_in_slice  片中的第一个宏块的地址,  片通过这个句法元素来标定它自己的地址。 要注意的是在帧场自适应模式下,宏块都是成对出现,这时本句法元素表示的是第几个宏块对,对应的第一个宏块的真实地址应该是2 * first_mb_in_slice  
        first_mb_in_slice   

    http://blog.sina.com.cn/s/blog_4ae178ba01017tk8.html

    6.

      如何确定slice_type:http://bbs.17959.cn/archiver/?tid-2780.html

      slice_type

        /* slice_type    指明片的类型 
           slice_type          Name of slice_type 
           0                        P (P slice) 
           1                        B (B slice) 
           2                        I (I slice) 
           3                        SP (SP slice) 
           4                        SI (SI slice) 
           5                        P (P slice) 
           6                        B (B slice) 
           7                        I (I slice) 
           8                        SP (SP slice) 
           9                        SI (SI slice) */
     
        slice_type   

    http://blog.163.com/laorenyuhai126@126/blog/static/19350779201112185137112

    http://www.cvzp.info/luoliaozhibo/20140528/694.html

     264解码实现:

    http://www.pudn.com/downloads98/sourcecode/java/detail400720.html

    码流结构解析:

    http://wenku.baidu.com/view/00bb007b31b765ce050814a9.html

    h264资料:

    http://www.pudn.com/downloads135/doc/detail573215.html

    http://www.pudn.com/downloads83/ebook/detail318673.html

    slice 条带类型:

    http://www.xuebuyuan.com/1722272.html

    http://wenku.baidu.com/view/d79fe21b964bcf84b9d57bd0.html

     http://bbs.csdn.net/topics/390601145?page=1

    中国视频网:

    http://www.chinavideo.org/forum.php?mod=forumdisplay&fid=29

    http://www.chinavideo.org/forum.php?mod=viewthread&tid=4165&extra=page%3D1

  • 相关阅读:
    今年暑假不AC
    亲和数
    改革春风吹满地
    hdu人见人爱A^B
    男人必看的10部电影
    富人和穷人之间的经典差异
    今日十句英文
    看透一个人起码要看的。
    人生经典20句
    解决ubuntu中mysql中文乱码问题
  • 原文地址:https://www.cnblogs.com/pengkunfan/p/3945445.html
Copyright © 2011-2022 走看看