用Mp4V2将H264和aac合成的mp4文件,在播放时拖拽的话,会出现卡顿现象(时间轴在走动,但画面会停滞几秒)

windychen20 2014-06-12 05:23:00
合成MP4文件的大概过程是(以下是部分代码片段):

while(len = ReadOneNaluFromBuf(pData,size,pos,nalu))
{
if(nalu.type == 0x07 && !m_isHaveAddSPS) // sps
{
// 添加h264 track
m_videoId = MP4AddH264VideoTrack
(m_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 false;
}
MP4SetVideoProfileLevel(m_hMp4File, 0xf); // Simple Profile @ Level 3

MP4AddH264SequenceParameterSet(m_hMp4File,m_videoId,nalu.data,nalu.size);
m_isHaveAddSPS = true;
}
else if(nalu.type == 0x08 && !m_isHaveAddPPS) // pps
{
MP4AddH264PictureParameterSet(m_hMp4File,m_videoId,nalu.data,nalu.size);
m_isHaveAddPPS = true;
}

//未加头信息时,直接跳过该帧
if(!m_isHaveAddSPS && !m_isHaveAddPPS)
{
pData += len;
size -= len;
continue;
}

if(nalu.type == 0x07 || nalu.type == 0x08 || nalu.type == 0x06 || nalu.type == 0x05 || nalu.type == 0x01)
{
if(pSampleNaluStart==NULL){pSampleNaluStart=nalu.data-4;}
sampleNaluLenth += len;
/*if(nalu.type == 0x07)
{
//m_curVideoTimeStamp += m_nTimeScale / m_nFrameRate;
if(!m_isHaveAddSPS){m_isHaveAddSPS = true;}else {pData += len;size -= len;continue;}
}

if(nalu.type == 0x08)
{
if(!m_isHaveAddPPS){m_isHaveAddPPS = true;}else {pData += len;size -= len;continue;}
}*/

if(nalu.type == 0x05)
{
//if(!bIsHaveSEI){if(m_frontFmtNalu.size==5){m_frontFmtNalu.data[3] += 1;}WriteSampleData(m_frontFmtNalu);}
//m_curVideoTimeStamp += m_nTimeScale / m_nFrameRate;
}
else if(nalu.type == 0x01)
{
//if(!bIsHaveSEI){if(m_frontFmtNalu.size==5){m_frontFmtNalu.data[3] += 1;}WriteSampleData(m_frontFmtNalu);}
//m_curVideoTimeStamp += m_nTimeScale / m_nFrameRate;
}
else if(nalu.type == 0x06)
{
/*if(m_frontFmtNalu.data==NULL){long len = sizeof(unsigned char)*1024; m_frontFmtNalu.data=(unsigned char*)malloc(len);memset(m_frontFmtNalu.data,0,len);}
memcpy(m_frontFmtNalu.data, nalu.data,nalu.size);
m_frontFmtNalu.size = nalu.size;
bIsHaveSEI = true;*/

printf("111111");
}


//WriteSampleData(nalu);
ret = true;
}
else
{
return false;
}
pData += len;
size -= len;
}






总之,合成后的mp4文件让它自动播放的话,完全正常。但是当将时间轴拖拽到某个时间点时,会卡顿几秒后,才开始正常播放。请问各位高手,这是什么原因啊
...全文
4299 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoyusi 2016-11-17
  • 打赏
  • 举报
回复
MP4AddH264VideoTrack 我崩在这个函数上了,因为打包成库,连log都没有,有老司机知道啥原因吗
求是猫 2015-11-27
  • 打赏
  • 举报
回复
卡顿是因为H.264只有从I帧处开始才能解码播放,而你跳到非I帧处了,所以需要等到下一个I帧出现才能继续解码播放。
xingtian19880101 2015-03-24
  • 打赏
  • 举报
回复
请问下,你这个问题解决了吗?我现在也在做mp4打包这一块,代码基本上网上各版本的组合,完整播放没一点问题,用迅雷看看播放时,拖动卡顿相当明显;VLC播放时画面只显示实际分辨大小,不自动拉伸;其它的播放器倒是正常!我的流程跟你的基本一样。
Tech Embedded 2014-11-25
  • 打赏
  • 举报
回复
楼主,能看看你的源码?

1,451

社区成员

发帖
与我相关
我的任务
社区描述
多媒体/设计/Flash/Silverlight 开发 图象工具使用
社区管理员
  • 图象工具使用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧