多媒体开发之---如何确定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/[email protected]/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

时间: 2024-08-08 05:37:44

多媒体开发之---如何确定slice_header slice_type 的位置的相关文章

多媒体开发之---h264格式slice_header

从Slice_Header学习H.264 写在前面: $     H.264我是结合标准和毕厚杰的书一块学的.看句法语义时最是头疼,一大堆的元素,很需要耐心.标准中在介绍某个元素的语义时,经常会突然冒出与之相关的另一个变量,这个变量一般都在前文中讲过,但那么多变量怎么可能看一遍就记住?这时我只能去前面重新找这个变量再看一遍.没办法,H.264这个庞大的结构内部肯定是环环相扣的,各个部分联系紧密,所以刚开始看时要搞明白H.264的主要细节以及相互间的关系不是特别容易,尤其看到一大堆不认识的变量时,

Android多媒体开发介绍(转)

Android多媒体开发介绍 转自:http://blog.csdn.net/reiliu/article/details/9060557 一.       多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3.AAC.AMR.JPG.PNG.GIF等.从功能上分为两部分,一是音/视频的回放(PlayBack),二是音视频的纪录(Recorder). CODEC(编解码器)使用OpenMAX 1L

多媒体开发之---h264格式详解

http://blog.csdn.net/bluebirdssh/article/details/6533501 http://blog.csdn.net/d_l_u_f/article/details/7260772 http://blog.csdn.net/sunnylgz/article/details/7680262 http://blog.csdn.net/heanyu/article/details/6204414 多媒体开发之---h264格式详解,布布扣,bubuko.com

多媒体开发库 之 SDL 详解

SDL 简介 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成.SDL提供了数种控制图像.声音.输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux.Windows.Mac OS X等)的应用软件.目前SDL多用于开发游戏.模拟器.媒体播放器等多媒体应用领域. SDL提供的功能 1. 视频 设置8bpp或更高的任意色彩深度的视频模式.如果某个模式硬件不支持,可以选择转化为另一模式. 直接写入线性的图像帧缓冲

Windows Phone - 多媒体开发

这里有一些比较好的wp源码下载:http://code.662p.com/list/14_1.html 前言在上篇文章讲述了如何新建一个Silverlight for Windows Phone的应用程序,这篇文章讲述如何在WindowsPhone上进行多媒体应用的开发.同时介绍当前Windows Phone Beta版本所支持媒体文件格式,以及讲述WindowsPhone多媒体开发的一些限制性和注意点.MediaElement控件的使用使用Silverlight开发一般的多媒体应用,使用Med

史上最全的iOS多媒体开发博客

这篇博客是史上最全的iOS多媒体开发博客,包括视频.音频.图片等多套API,如果要实现多媒体的功能,点进去找找有用的东西吧:http://www.cnblogs.com/kenshincui/p/4186022.html#autoid-0-0-0..

(android 地图实战开发)2 创建MapActivity,根据设备当前位置,显示地图

(android 地图实战开发)2 创建MapActivity,根据设备当前位置,显示地图 http://www.cnblogs.com/macroxu-1982/archive/2011/09/13/2174657.html 实现效果: 获取手机gps当前的位置,显示位置对于的google地图. 具体的步骤: 1 Step One  创建包含MapView控件的应用界面 <com.google.android.maps.MapView android:layout_width="fill

多媒体开发之---h264 图像参数级语义

(四)图像参数集语义 pic_parameter_set_rbsp( ) {       // pic_parameter_set_id 用以指定本参数集的序号,该序号在各片的片头被引用.    pic_parameter_set_id       // seq_parameter_set_id  指明本图像参数集所引用的序列参数集的序号.     seq_parameter_set_id      // entropy_coding_mode_flag  指明熵编码的选择,本句法元素为0时,表

用 GStreamer 简化 Linux 多媒体开发

一.基本概念 GStreamer 作为 GNOME 桌面环境推荐的流媒体应用框架,采用了基于插件(plugin)和管道(pipeline)的体系结构,框架中的所有的功能模块都被实现成可以插拔的组件(component), 并且在需要的时候能够很方便地安装到任意一个管道上,由于所有插件都通过管道机制进行统一的数据交换,因此很容易利用已有的各种插件"组装"出一个功能完善的多媒体应用程序. 1.1 元件处理 对于需要应用 GStreamer 框架的程序员来讲,GstElement 是一个必须