使用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的封装不是很了解,这里仅仅是给出我遇到这个问题的解决方法而已。

你可能感兴趣的:(使用MP4V2将H264转MP4问题记载)