前言:
mp4文件目前已经成为了流媒体音视频行业的通用标准文件格式,它是基于mov格式基础上演变来的,特别适合多平台播放,录制一次,多个平台都可使用。但是,由于mp4格式相对比较复杂,直到mp4v2这个开源工程的出现,解决了这个问题。
通常,我们在使用mp4文件时,会遇到两个问题:如何从已有的mp4文件中抽取音视频数据帧;如何将音视频数据帧录制成mp4文件,并保持音视频同步。
首先,我们需要对mp4v2开源库进行编译,源码下载地址如下:
CSDN:https://download.csdn.net/download/haoyitech/10290353
mp4v2的开源库提供多种平台的编译,我们要在windows下做演示,选择vs2010编译,vs2010的编译工程又提供多个编译输出,为了避免动态链接库带来的麻烦,我们选择静态lib的方式,调试版:Debug static(MTD),发行版:Release static(MT)。静态lib库的好处是,不用考虑dll加载路径。
mp4v2\build32\bin\Debug Static (MTd)\libmp4v2D.lib
mp4v2\build32\bin\Release Static (MT)\libmp4v2.lib
源码下载:
CSDN:https://download.csdn.net/download/haoyitech/10291430
源码说明:
开发工具:下载后,请用 VS2010 打开。
总体思路:准备好标准mp4文件(H264+AAC),使用mp4v2提供的标准API,解析出音视频格式信息,视频需要获取关键的PPS和SPS,音频需要获取采样率、声道、扩展信息等等。
测试需要的mp4文件 => sample_libmp4v2\bin\sample.mp4
mp4v2需要的头文件 => sample_libmp4v2\libmp4v2
mp4v2静态调试库 => sample_libmp4v2\libmp4v2\libmp4v2D.lib
mp4v2静态发行库 => sample_libmp4v2\libmp4v2\libmp4v2.lib
浩一科技代码辅助库 => sample_libmp4v2\common
注意:在vs2010工程配置当中,需要在预处理定义中加入 MP4V2_EXPORTS,否则,会在编译中出现链接失败的问题。
关键代码:(详见Csample_libmp4v2Dlg)
1、mp4v2提供的调试回调演示:
void myMP4LogCallback( MP4LogLevel loglevel, const char* fmt, va_list ap)
{
// 组合传递过来的格式...
CString strDebug;
strDebug.FormatV(fmt, ap);
if( (strDebug.ReverseFind('\r') < 0) && (strDebug.ReverseFind('\n') < 0) ) {
strDebug.Append("\r\n");
}
// 进行格式转换,并打印出来...
string strANSI = CUtilTool::UTF8_ANSI(strDebug);
TRACE(strANSI.c_str());
}
// 解析mp4文件...
void Csample_libmp4v2Dlg::OnBnClickedButtonParse()
{
// 设置MP4调试级别 => 最高最详细级别...
MP4LogLevel theLevel = MP4LogGetLevel();
MP4LogSetLevel(MP4_LOG_VERBOSE4);
MP4SetLogCallback(myMP4LogCallback);
// 打开MP4文件...
CString strMP4File;
MP4FileHandle hMP4Handle = MP4_INVALID_FILE_HANDLE;
strMP4File.Format("%s\\sample.mp4", CUtilTool::GetExePath((HINSTANCE)NULL).c_str());
string strUTF8 = CUtilTool::ANSI_UTF8(strMP4File);
hMP4Handle = MP4Read( strUTF8.c_str() );
MP4Close(hMP4Handle);
}