使用mp4v2将aac音频h264视频数据封装成mp4开发心得

转载 2013年08月23日 11:50:03

 这阵子在捣鼓一个将游戏视频打包成本地可播放文件的模块。开始使用avi作为容器,弄了半天无奈avi对aac的支持实在有限,在播放时音视频时无法完美同步。

关于这点avi文档中有提到:

For AAC, one RAW AAC frame usually spans over 1024 samples. However, depending on
the source container (e.g. ADTS), it is theoretically possible that you are not able to extract
packets of equal duration from your source le. In this case, it is highly recommended not
to mux the AAC stream into AVI, but report a fatal error instead.

因此建议大家不要用avi打包aac,如果实在需要avi格式,可以换成mp3。


言归正传,下面重点说说mp4打包时遇到的几个问题,希望对后来开发这方面的朋友能有帮助,少走弯路。

首先需要下载编译开源的mp4v2库。这里一般没什么问题,值得一提的是,mp4v2静态库会导出函数符号。如果你想让程序瘦身,可以这么做在windows的工程属性中去掉MP4V2_EXPORTS预定义,添加MP4V2_USE_STATIC_LIB,这样最终的程序可以小100多KB。

mp4v2在vc2008下编译release版会在link时出现link内部错误(我遇到了,不知道其他人是否也遇到),需要在工程中去掉link时优化,再编译即可。

使用mp4v2打包音视频的具体步骤网上已经有很多例子,不再此啰嗦了,就说说需要注意的几点吧。

1、音频aac不需要包含adts头,即在设置faac选项时:

struConfig.outputFormat = 0; /* Bitstream output format (0 = Raw; 1 = ADTS) */

如果你包含了这个头,我测试下来迅雷播放器可以支持,但是百度影音、暴风影音放出来没声音。(ps,我整个开发过程下来迅雷播放器支持度最好,百度和暴风影音在格式设置错误情况下会出现崩溃和无声音现象,绝非广告)

2、MP4AddAudioTrack时,注意第三个参数sampleDuration要设置正确。如果每次添加的音频数据样本数相同,可以在这里先设置好。mp4v2建议把刻度设置为采样率,这样第三个参数就是每次送入数据块的样本数。这个数据可以在编码aac时得到,faacEncOpen返回的input样本数如果是2048,那么双通道实际就是1024。

3、设置完这些参数后,本以为万事大吉,但是播放器放出来还是没有声音。那就需要用MP4SetTrackESConfiguration设置音频解码信息。音频解码信息怎么来,可以从faac里faacEncGetDecoderSpecificInfo得到,下面是我的代码:

unsigned int CAACCodec::GetDecoderSpecificInfo(unsigned char * & apInfo)
{
    if ( m_hCodec == NULL )
    {
        return 0;
    }

    unsigned long uLen = 0;
    faacEncGetDecoderSpecificInfo(m_hCodec, &apInfo, &uLen);
    return uLen;
}

将返回的信息,再用MP4SetTrackESConfiguration设置到音频track里去就ok了。

这里有个问题还要注意下,解码信息这块内存,是faac用malloc方式分配出来的,所以你不要忘记free它,否则会造成内存泄露(虽然很小,才2字节)

 源出处 http://blog.csdn.net/mywfool/article/details/8581663

这个哥们写的很实在。我都验证过了。不过他让我们加的QQ群有点坑爹了。我不敢加。对那位兄弟说一声,出处加了。放心吧!!谢谢你,对我帮助挺大的。

相关文章推荐

使用mp4v2将aac音频h264视频数据封装成mp4开发心得

这阵子在捣鼓一个将游戏视频打包成本地可播放文件的模块。开始使用avi作为容器,弄了半天无奈avi对aac的支持实在有限,在播放时音视频时无法完美同步。 关于这点avi文档中有提到: For...

Mp4v2实现h264+aac打包成Mp4视频文件

使用mp4v2实现录制mp4视频,需要准备如下信息: 1、获取mp4v2源码并编译成库文件,对于mp4v2的编译可以看前面的文章android 编译mp4v2 2.0.0生成动态库 ; 2...

Mp4v2实现h264+aac打包成Mp4视频文件

使用mp4v2实现录制mp4视频,需要准备如下信息: 1、获取mp4v2源码并编译成库文件,对于mp4v2的编译可以看前面的文章android 编译mp4v2 2.0.0生成动态库 ; ...
  • dxpqxb
  • dxpqxb
  • 2014年12月30日 15:27
  • 1801

mp4v2同时录制视频和声音播放时会在中途自动终止的解决方法

写入文件时使用互斥对象,写视频和声音都要加!就好了。 pthread_mutex_lock(&mutex); MP4WriteSample(mp4lei.hMp4file, mp4lei....

mp4v2录制音视频同步方法

#include long long getSystemTime() {     struct timeb t;     ftime(&t);     return 1000 * t.tim...

MP4v2 基本使用(二)

MP4转H264文件 本文最目标是基本的MP4v2接口的使用,并且实现一个简单的提取mp4文件里面264流的功能; 下看看H264文件的基本常识 NAL 头 0x00 0x00 0x00 0x0...

基于mini2440的ov9650摄像头裸机测试 【独家】

基于mini2440的ov9650摄像头裸机测试         mini2440提供了一个摄像头接口,可以输出RGB24,RGB16的原始图像还可以输出编码的如YUV格式的图像,并提供了偏移翻转,...
  • aiku969
  • aiku969
  • 2014年12月27日 23:59
  • 809

使用mp4v2将aac音频h264视频数据封装成mp4开发心得

这阵子在捣鼓一个将游戏视频打包成本地可播放文件的模块。开始使用avi作为容器,弄了半天无奈avi对aac的支持实在有限,在播放时音视频时无法完美同步。 关于这点avi文档中有提到: For AAC, ...
  • mywfool
  • mywfool
  • 2013年02月15日 18:44
  • 5545

Mp4v2实现h264+aac打包成Mp4视频文件

使用mp4v2实现录制mp4视频,需要准备如下信息: 1、获取mp4v2源码并编译成库文件,对于mp4v2的编译可以看前面的文章android 编译mp4v2 2.0.0生成动态库 ; 2、获取...

多媒体 Mp4v2实现h264+aac打包成Mp4视频文件

使用mp4v2实现录制mp4视频,需要准备如下信息: 1、获取mp4v2源码并编译成库文件,对于mp4v2的编译可以看前面的文章android 编译mp4v2 2.0.0生成动态库 ; 2...
  • skdkjxy
  • skdkjxy
  • 2014年10月27日 13:50
  • 2439
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用mp4v2将aac音频h264视频数据封装成mp4开发心得
举报原因:
原因补充:

(最多只允许输入30个字)