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