H264 帧边界识别简介
来源:互联网 发布:加入中国籍难吗 知乎 编辑:程序博客网 时间:2024/06/11 19:48
http://blog.sina.com.cn/s/blog_76550fd70101gh1q.html
H.264 将构成一帧图像所有nalu 的集合称为一个AU,帧边界识别实际上就是识别AU。
因为H.264 取消帧级语法,所以无法简单地从码流中获取AU。解码器只有在解码的过
程中,通过某些语法元素的组合才能判断一帧图像是否结束。一般来说,解码器必须在
完成一帧新图像的第一个slice_header 语法解码之后,才能知道前一帧图像已经结束。
因此,最严谨的AU 识别步骤如下:
步骤 1 对码流实施“去03 处理”。
步骤 2 解析nalu 语法。
步骤 3 解析slice_header 语法。
步骤 4 综合判断前后两个nalu 以及对应的slice_header 中的若干个语法元素,看是否发生变化。
如果发生变化,则说明这两个nalu 属于不同的帧,否则说明这两个nalu 属于同一帧。
----结束
显然,在解码前完成上述的AU 识别消耗许多CPU 资源,因此不推荐使用AU 方式解码
为了提供一种简单的AU 识别方案,H.264 规定一种类型为09 的nalu,即编码器在每次完成一个AU 编码后,在码流中插入一个类型为09 的nalu,在这个前提下,解码器只需要从码流中搜索类型为09 的nalu 即可获得一个AU。
H.264 并不强制要求编码器插入类型为09 的nalu,因此并非所有的码流都具备这种特征。对于
编码器和解码器协同工作的应用场景,建议让编码器插入类型为09 的nalu,这样可以降低解码
器识别AU 的代价。
为了降低解码器在解码前识别AU 的代价,本文提出一种高效的AU 识别方法,其主要
思路是利用一帧图像的第一个slice_header 中的语法元素first_mb_in_slice 一般等于0 这
个特征(对于包含ASO 或者FMO 特性的码流,这个条件不一定成立)。
typedef struct ParseContext{ unsigned int FrameStartFound; unsigned int iFrameLength;} ParseContext;signed int DecLoadAU(unsigned char* pStream, unsigned int iStreamLen, ParseContext *pc) { unsigned int i; unsigned int state = 0xffffffff; if( NULL == pStream ) { return -1; } for( i = 0; i < iStreamLen; i++) { if( (state & 0xFFFFFF1F) == 0x101 || (state & 0xFFFFFF1F) == 0x105 ) { if (i >= iStreamLen) { break; }if( pStream[i] & 0x80) { if(pc->FrameStartFound) { pc->iFrameLength = i - 4; pc->FrameStartFound = 0; state = 0xffffffff; return 0; } else { pc->FrameStartFound = 1; } } } if (i < iStreamLen) { state = (state << 8) | pStream[i]; } } pc->FrameStartFound = 0; return -1; }
解决了最关键的问题后, 下面就是将解码完的数据送去播放的问题了, 可以启动一个Timer, 定时去读取一帧的数据送去解码就可以。针对不同的帧率调整Timer的时间即可,当然最正规的做法是根据MP4或者AVI文件中的时间戳。
- H264 帧边界识别简介
- H264 帧边界识别简介
- H264 帧边界识别简介
- H264 帧边界识别简介
- H264帧边界识别简介(转载)
- h264帧边界识别
- 帧边界识别简介
- H264中NAL帧识别
- h264 ES流文件通过计算first_mb_in_slice区分帧边界
- h264码流文件通过计算first_mb_in_slice区分帧边界
- h264 ES流文件通过计算first_mb_in_slice区分帧边界
- h264简介
- PCL边界识别
- H264(NAL简介与I帧判断)
- H264(NAL简介与I帧判断)
- H264(NAL简介与I帧判断)
- H264(NAL简介与I帧判断)
- H264(NAL简介与I帧判断)
- C++多重继承 实现解耦,mvc分离
- C++11 理解 (十四) 之 显式类型转换子
- ORACLE相关语法--子程序和程序包(package,function,procedure)
- 测试管理及测试工具盒集
- JAVA第十四弹(异常处理二)
- H264 帧边界识别简介
- android adb启动失败问题 adb server is out of date. killing... ADB server didn't ACK * failed to start daem
- 8种排序算法--冒泡排序
- 转载_Linux 内核驱动--阻塞与非阻塞机制及Poll/Select分
- 用IBM WebSphere DataStage进行数据整合: 第 1 部分
- 开启Objective-c的学习之旅(三)
- 浅析C#扩展方法
- 不为人知的关闭程序提示【xitongshoucang】
- BZOJ 1293 [SCOI2009] 生日礼物 题解与分析