本文是基于NAL Unit提取的基础上进行解析,提取EBSP中的SODB元素
【H264解析】1、提取一个Nal Unit单元
1、解析NAL Unit类型
int CStreamFile::Parse_h264_bitstream()
{
int ret = 0;
UINT8 nalType = 0;
UINT32 sliceIdx = 0;
do
{
/* 提取NAL UNIT单元 */
ret = find_nal_prefix();
//解析NAL UNIT
if (m_nalVec.size())
{
UINT8 nalType = m_nalVec[0] & 0x1F; /* 获取每个NAL Unit类型 */
Dump_NAL_type(nalType);
ebsp_to_sodb();
}
} while (ret);
return 0;
}
输出
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL5cTNyQDNwITM0ADNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
类型对应关系
- 见H264标准文档表7-1
2、EBSP提取SODB
/* 00 00 X X X 03查找03所在的位置,找打之后向前索引,是否为00 00 ,是则将03删除*/
void CStreamFile::ebsp_to_sodb()
{
if (m_nalVec.size() < 3)
{
return;
}
/* C++ 迭代器的使用 */
for (vector<UINT8>::iterator itor = m_nalVec.begin() + 2; itor != m_nalVec.end(); )
{
if ((3 == *itor) && (0 == *(itor-1)) && (0 == *(itor-2)))
{
/* 一旦迭代器中的元素被删除,那么这个迭代器就失效了,
* 所以需要在删除之后定义一个临时的迭代器来保存删除之后的下一个元素
*/
vector<UINT8>::iterator temp = m_nalVec.erase(itor);
itor = temp;
}
else
{
itor++;
}
}
}