使用MP4V2将H264转MP4问题记载

在Linux下利用MP4V2将H264转MP4,主要使用 https://blog.csdn.net/qq_29350001/article/details/73742075中的https://pan.baidu.com/s/1mi9M5ew代码,遇到这样的问题:使用原作者的给test.264生成的MP4文件能够正常播放,但是使用自己264文件生成的MP4文件仅能播放几秒(使用电脑自带播放器,若使用VLC播放,则会打开很多vlc,而且大部分无法正常显示)。经分析发现原作者的test.264文件仅有一个pps和sps,而大部分的264文件会在每个I帧前面加上SPS和PPS。
在函数int MP4Encoder::WriteH264Data(MP4FileHandle hMp4File, const unsigned char* pData, int size)中有这样的代码:

while (len = ReadOneNaluFromBuf(pData, size, pos, nalu))
    {
        if (nalu.type == 0x07) // sps  
        {
            // 添加h264 track      
            m_videoId = MP4AddH264VideoTrack
            (hMp4File,
                m_nTimeScale,
                m_nTimeScale / m_nFrameRate,
                m_nWidth,     // width  
                m_nHeight,    // height  
                nalu.data[1], // sps[1] AVCProfileIndication  
                nalu.data[2], // sps[2] profile_compat  
                nalu.data[3], // sps[3] AVCLevelIndication  
                3);           // 4 bytes length before each NAL unit  
            if (m_videoId == MP4_INVALID_TRACK_ID)
            {
                printf("add video track failed.\n");
                return 0;
            }
            MP4SetVideoProfileLevel(hMp4File, 1); //  Simple Profile @ Level 3  

            MP4AddH264SequenceParameterSet(hMp4File, m_videoId, nalu.data, nalu.size);
        }
        else if (nalu.type == 0x08) // pps  
        {
            MP4AddH264PictureParameterSet(hMp4File, m_videoId, nalu.data, nalu.size);
        }
        else

每次遇到一个sps都会生成一个新track,这是导致生成的MP4文件仅能播放几秒的重要原因,因此仅需判断是不是第一个sps和pps就行了,若是第一个则生成track,反之则不生成。
本人对MP4的封装不是很了解,这里仅仅是给出我遇到这个问题的解决方法而已。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值