专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 多媒体/流媒体开发

h264解码的有关问题

发布时间:2011-06-27 19:30:51 文章来源:www.iduyao.cn 采编人员:星星草
h264解码的问题
h264码流是用ts封装的,帧率15,尺寸320*180,解复用后的前几帧数据如下:
第一帧:
00,00,00,01,09,10,00,00,00,01,67,42,e0,0d,91,a0,50,67,e7,c0,54,80,80,80,a0,00,00,7d,20,00,0e,a6,0c,10,00,26,16,00,72,34,0e,00,04,00,00,00,01,68,ce,38,80,00,00,00,01,06,00,05,ec,7c,88,be,10,01,02,0e,40,80,00,00,00,01,65,88,80,00,0c,0e,84,ff,ff,c2,71,40,00,40,76,ff,72,7f,c4,3f,f0,e4,12,3d,d9,fe,3d,46,d8,e2,87,69,9a,73,4b,ef,5a,85,f6,02,6b,f6,f8,d3,dd,34,d7,15,b6,f2,6b........
第二帧:
40,4a,e1,78,d7,21,37,29,92,e4,f7,42,23,29,7a,d8,18,71,89,7f,15,c1,0f,c7,f8,c4,5d,cc,59,cb,f2,e2,16,27,6c,01,d6,d4,62,9b,9c,a8,00,7e,77,90,72,44,4a,26,e3,c2,fc,f2,f4,7d,b3,75,89,be,fd,da,ea,e2,7d,d9,75,71,1e,f1,36,23,a0,82,78,cb,04,07,09,8f,b8,da,e3,1f,21,55,bf,a7,33,08,c8,80,66,5f,74,8e,c3,f8,af,4c,f4,a6,dc,77,6e,74,1b,5b,d7,fb,a3,b2,b1,38,f8,37,72,b3,eb,f5,f9,b5,c4,5b,a5,94,84,f4,26,5f,29,cd,64,1d,19,28,94,8e,f5,08,b0,67,bc,bf,d0,39,42,43,4d,5a,c7,4d,bd,42,3a,1f,ad,ca,c5,e5,f5,b9,0e,20,7e,d8,11,12..........
第三帧:
00,00,00,01,09,30,00,00,00,01,06,01,02,05,40,80,00,00,00,01,41,9a,14,11,f3,7a,93,97,dd,ad,c2,1c,b7,ae,5e,fc,be,79,3b,64,e5,a0,65,96,d4,21,d8,32,f7,d8,2a,6b,95,82,5b,36,79,a9,3b,f2,22,d2,fb,fc,bb,ff,bc,0a,59,78,ac,ec,d6,dc,df,cb,ed,a9,5b,ed,77,ee,2f,4b,bf,d9,7d,2e,c4,e5,0c,50,16,60,cf,58,92,6f..........
第四帧:
00,00,00,01,09,30,00,00,00,01,06,01,02,0a,40,80,00,00,00,01,41,9a,28,19,f3,7b,64,e6,f4,f3,ea,e1,3b,fd,ff,f3,57,ee,5e,ff,ab,ff,a8,9a,cc,c5,66,62,5e,2b,6e,dd,bf,6e,ef,55,17,ed,f7,ec,21,a0,ba,1f,7d,e5,79,b2................
第五帧:
00,00,00,01,09,30,00,00,00,01,06,01,02,0f,40,80,00,00,00,01,41,9a,3c,19,f3,7b,a8,47,c2,12,7b,f8,4b,de,fe,79,3d,f5,37,b5,e1,0f,6e,97,7e,9f,2d,fe,69,b5,f2,cb,7f,5d,f2,4b,b7,ef,df,92,27,9b,cd,eb,2f,15,bf,7f,7a,9d,f5,2e,c7,f7,f3,76,5f,04,5d,07,7f,bb,fc,92,6d,f4,ac,c2,af,c8,19,a1,55,49,ed,ee,09,7a,17,7e,ab,89,e5,fd,b9,79,b7,f6,fd,1a,5c,b4,d2,a7,d4,be,fe,5b,fd,42,5d,a9,17,a1,7c,77,40,ec,1a,dd,89,81,7e,2e,36,22,20,7c,8a,68,0b,e3,bd,01,11,47,ec,22,84,95,fa,d7,13,d6..................
第六帧:
00,00,00,01,09,30,00,00,00,01,06,01,02,14,40,80,00,00,00,01,41,9a,50,10,9c,bb,eb,9b,7f,c5,77,da,d7,7b,0f,f0,55,bf,b7,e3,a3,26,5d,c2,5e,c1,fa,2d,46,72,d0,c4,b2,e7,5d,ff,27,bd,01,e6,d8,22,f7,62,4e,26,d1,90,7a,1c,bc,da,65,95,5b,82,4d,ae,be,08,b6,fa,ed,96,fe,fb,fb,f7,5c,67,b2,e7,86,9b,bc,7f,97,ee,df,f1,fb,0f,7f,4f,5c,be,fe,6a,7f,cd,be,63,78,1c,ff,d0,52,00,ea,29,5d,03,ca,12,49,83,d4,72,63,67,c0,28,3e,8d,05,18,9a,94,2a,1b,62,e9,bd,bc,7f,9a,5a,41,89,71,cb,50,f5,59,47,ae,a5,fe,de,91,7a,f7,08,f7,77,fd,97,97,af,c4,6f,b4,fd,f4,3a,ce,cb,b5,da,f4,10,d5,03,f6,03,b4,41,1f,c6,6b,f6,06,82,b0,3e,ff,17,e7,08,2d,a7,4b,43,f2,97,df,df,6b,b6,4b,f8,4c,92,a8,fa,2a,2d,f4,54,46,50,4f,02,20,5f,07,07,51,14,2f,27,36,26,e3,7a,8d,c4,be,21,23,42..................

  ................................................................................................

现在用的是TI的Codec,但只能正确解出其中的关键帧,也就是第1、第16、第31帧...可以正确解出,其它的Codec会报错。哪位高手能帮分析一下原因呀?


------解决方案--------------------
建议看看MPEG4-10部分的文档。。

------解决方案--------------------
不用客气,h264的常用解码器因为都需要一帧一帧的传,否则解码失败,当然你自己也可以写h264解码器支持查找解码,elecard的h264解码器好像就可以。mpeg2,ac3等常用解码器都支持这种任意分割解码,所以可以不用查找,起码微软的mpeg2 demuxer是这个做的。
你先看看payload_unit_start_indicator=1TS包的数据段开始是不是PES的00 00 01 e0 (也可能是e1~ef)开头的,然后看一下PES后面的ES(H264流)数据段开始是不是H264的NAL头 00 00 00 01 xx开始。如果是的话,证明每个PES包包含完整的N帧,查找就简单一点,时间戳比较好打,自需要在这个PES中分离帧就行了。如果不是就比较麻烦了,要将相邻的PES里面的ES数据连接起来查找,不知道帧的开头和结尾,查找麻烦点,时间戳也麻烦。
H264的N帧纯数据的分离帧代码参如下:
C/C++ code

//分解: BYTE *pData, int nLen;

int nPrevCode = 0;
int nFrames = 0;

BYTE *pFrameData = pData;
int nFrameLen = nLen;

BYTE *pH264Data = pData;
int nH264Len = nLen;
while(nH264Len >= 4)
{
    if(pH264Data[0] == 0x00 && pH264Data[1] == 0x00 && pH264Data[2] == 0x01)
    {
        int code = pH264Data[3] & 0x1f;
        if(code == 0x01 || (code >= 0x05 && code <= 0x09))
        {
            if(nPrevCode == 0x01 || nPrevCode == 0x05)
            {
                if(nFrames > 0)
                {
                    if(pH264Data[-1] == 0x00) pH264Data--;
                    nFrameLen = pH264Data - pFrameData;
                    // push_frame(pFrameData, nFrameLen)
                    pFrameData = pH264Data;
                }
            }

            nPrevCode = code;
        }
        if(code == 0x01 || code == 0x05)
        {
            nFrames++;
        }

        pH264Data += 4;
        nH264Len -= 4;
    }
    else
    {
        pH264Data++;
        nH264Len--;
    }
}

nFrameLen = nLen - (pFrameData - pData);
// push_frame(pFrameData, nFrameLen)
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: