前言:
mp4文件目前已经成为了流媒体音视频行业的通用标准文件格式,它是基于mov格式基础上演变来的,特别适合多平台播放,录制一次,多个平台都可使用。但是,由于mp4格式相对比较复杂,直到mp4v2这个开源工程的出现,解决了这个问题。
通常,我们在使用mp4文件时,会遇到两个问题:如何从已有的mp4文件中抽取音视频数据帧;如何将音视频数据帧录制成mp4文件,并保持音视频同步。
上一篇文章已经使用mp4v2从mp4文件中抽取音视频数据帧(文章),本篇文章讲述如何将音视频数据帧(AAC+H264)保存成mp4文件,并保持音视频同步。
源码下载:
CSDN:https://download.csdn.net/download/haoyitech/10291438
源码说明:
开发工具:下载后,请用 VS2010 打开。
总体思路:从标准mp4文件,使用mp4v2提供的标准API,解析出音视频格式信息,视频需要获取关键的PPS和SPS,音频需要获取采样率、声道、扩展信息等等。将这些格式信息重组之后用来创建音视频轨道。
测试需要的mp4文件 => sample_save_mp4\bin\sample.mp4
mp4v2需要的头文件 => sample_save_mp4\libmp4v2
mp4v2静态调试库 => sample_save_mp4\libmp4v2\libmp4v2D.lib
mp4v2静态发行库 => sample_save_mp4\libmp4v2\libmp4v2.lib
浩一科技代码辅助库 => sample_save_mp4\common
注意:在vs2010工程配置当中,需要在预处理定义中加入 MP4V2_EXPORTS,否则,会在编译中出现链接失败的问题。
关键代码:(详见Csample_save_mp4Dlg)
1、mp4v2提供的调试回调演示:详见上一篇文章
2、有关mp4路径问题:详见上一篇文章
3、解析音视频格式信息头:详见上一篇文章
4、循环抽取并打印音视频数据帧:详见上一篇文章
5、创建视频轨道:
bool Csample_save_mp4Dlg::BuildVideoTrack(string & inSPS, string & inPPS)
{
if( m_lpRecMP4 == NULL || inSPS.size() <= 0 || inPPS.size() <= 0 )
return false;
// 获取 width 和 height...
int nPicWidth = 0;
int nPicHeight = 0;
if( inSPS.size() > 0 ) {
CSPSReader _spsreader;
bs_t s = {0};
s.p = (uint8_t *)inSPS.c_str();
s.p_start = (uint8_t *)inSPS.c_str();
s.p_end = (uint8_t *)inSPS.c_str() + inSPS.size();
s.i_left = 8; // 这个是固定的,对齐长度...
_spsreader.Do_Read_SPS(&s, &nPicWidth, &nPicHeight);
}
// 正在创建视频轨道...
TRACE("=== 正在创建视频录制轨道,视频高:%lu,视频宽:%lu ===\n", nPicWidth, nPicHeight);
// 调用封装接口,直接创建