使用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群有点坑爹了。我不敢加。对那位兄弟说一声,出处加了。放心吧!!谢谢你,对我帮助挺大的。

Winsock API 编程介绍

Winsock API 编程介绍 作者:table email: tablejiang@21cn.com 相信很多人都对网络编程感兴趣,下面我们就来介绍,在网络编程 中应用最广泛的编程接口...
  • table
  • table
  • 2001-08-07 11:51:00
  • 1388

使用mp4v2将H264+AAC合成mp4文件以及调试过程

录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流; (2)将H...
  • dxpqxb
  • dxpqxb
  • 2014-12-24 11:09:38
  • 1652

最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)

打算记录一下基于FFmpeg的封装格式处理方面的例子。包括了视音频分离,复用,封装格式转换。这是第3篇。本文记录一个基于FFmpeg的视音频复用器(Simplest FFmpeg muxer)。视音频...
  • leixiaohua1020
  • leixiaohua1020
  • 2014-10-09 00:47:17
  • 55135

多媒体 MP4V2 录制mp4(h264+aac)音视频同步

MP4录制程序是根据mpeg4ip中mpeg4ip-1.5.0.1\server\mp4live\file_mp4_recorder.cpp文件改的。程序支持h264+aac(raw 流)的写入方式,...
  • skdkjxy
  • skdkjxy
  • 2014-10-27 13:42:31
  • 3780

如何使用mp4v2将H264+AAC裸流录制成mp4文件,并保持音视频同步【源码】【mp4】【录像】

前言:    mp4文件目前已经成为了流媒体音视频行业的通用标准文件格式,它是基于mov格式基础上演变来的,特别适合多平台播放,录制一次,多个平台都可使用。但是,由于mp4格式相对比较复杂,直到mp4...
  • haoyitech
  • haoyitech
  • 2018-04-03 11:10:29
  • 32

【rtsp录制器】testRTSPClient+mp4v2录制mp4(h264+aac)

live555、DSS都是常见开源rtsp服务器
  • lshmusic
  • lshmusic
  • 2014-09-05 11:22:35
  • 2620

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

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

7.使用directshow采集视音频并进行H264和ACC实时编码再实时用MP4V2封装成MP4

使用Dshow进行视音频采集,采集的过程中将音频和视频都放进同一个队列中去,然后开启一个线程,从队列中一个一个取出来进行实时编码,取到视频就用X264进行编码,取到音频就用faac编码,编码的数据不再...
  • klamen
  • klamen
  • 2017-09-12 17:29:50
  • 1218

Mp4V2库编译及使用

用Mp4V2 库将H264流录成MP4文件
  • fb731666148
  • fb731666148
  • 2015-04-09 12:07:28
  • 3919

实现用FFmpeg接收RTSP,把H264视频和AAC音频录制成MP4文件(附完整代码)

  FFmpeg支持Rtsp接收功能,并且相关的协议实现已经很完善了,另外它也支持保存文件的功能,这里我就向大家介绍怎么用它的API来实现这两个功能。   我把接收RTSP和录制文件的逻辑都用一个类R...
  • toshiba689
  • toshiba689
  • 2018-03-02 20:48:11
  • 335
收藏助手
不良信息举报
您举报文章:使用mp4v2将aac音频h264视频数据封装成mp4开发心得
举报原因:
原因补充:

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