用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文件让它自动播放的话,完全正常。但是当将时间轴拖拽到某个时间点时,会卡顿几秒后,才开始正常播放。请问各位高手,这是什么原因啊
...全文
4357 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
  • 打赏
  • 举报
回复
楼主,能看看你的源码?
【ACDC微电网的能源管理策略】微电网仿真模型包括光伏发电机、燃料电池系统、超级电容器和直流侧的电池,包括电压源变换器(VSC),用于将微电网的直流侧与交流侧相连接Simulink仿真实现内容概要:本文介绍了一个用于ACDC微电网能源管理策略的Simulink仿真模型,该模型集成了光伏发电机、燃料电池系统、超级电容器和直流侧电池等多种分布式能源,并通过电压源变换器(VSC)实现微电网直流侧与交流侧的连接。文档重点展示了微电网中多能源协调控制与能量管理的仿真方法,涵盖系统建模、能量调度策略设计及动态响应分析,旨在提高微电网运行的稳定性与能效。此外,文中还提及多种相关电力系统仿真案例,突出其在科研与工程实践中的应用价值。; 适合人群:具备一定电力系统、新能源技术及Simulink仿真基础的科研人员、电气工程专业研究生及从事微电网、分布式能源系统设计的工程技术人员。; 使用场景及目标:①用于微电网多能源系统建模与仿真,掌握VSC在交直流互联中的作用;②研究微电网能量管理策略,优化能源调度与系统稳定性;③作为科研项目或毕业设计的技术参考,支撑高水平论文复现与创新研究。; 阅读建议:建议结合Simulink实际操作,逐步构建模型并调试参数,重点关注各能源单元的控制逻辑与VSC的动态响应特性,同可参考文中提到的优化算法与控制策略进行扩展研究。

1,450

社区成员

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

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