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

前言:

    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);
	// 调用封装接口,直接创建
使用 MP4v2 AAC 编码音频写 M4A 文件可以通过以下步骤完: 首先,需要准备好要写入的音频数据,并使用 AAC 编码格式进行编码。AAC 是一种广泛使用的音频编码格式,可以提供高质量的音频压缩。可以使用 MP4v2 库中的编码器功能将音频数据转换为 AAC 格式。 接下来,在使用 MP4v2 库之前,需要确保已经正确安装和配置了该库。根据操作系统的不同,可以在官方网站上找到相关的安装和配置指南。 一旦确认库的安装和配置完毕,就可以开始编写代码了。首先,需要导入 MP4v2 库,并创建一个 MP4 文件对象。然后,通过调用 MP4SetAudioProfileLevel 函数设置音频的编码参数,例如比特率、声道数等。 接下来,需要将编码后的 AAC 音频数据写入 M4A 文件。可以使用 MP4WriteSample 函数来实现这一步骤。需要注意的是,写入音频数据时需要指定音频帧的时间戳,以确保音频数据的顺序正确。 最后,需要调用 MP4Close 函数来关闭文件,保存并释放资源。 使用 MP4v2 AAC 编码音频写 M4A 文件的示例代码如下: ```cpp #include <mp4v2/mp4v2.h> void writeM4AFile(const char* audioFileName, const char* outputFile) { MP4FileHandle fileHandle = MP4Create(outputFile); // 设置音频编码参数 MP4SetAudioProfileLevel(fileHandle, 0x2); // AAC-LC MP4SetAudioChannels(fileHandle, 2); // 声道数 MP4SetAudioDuration(fileHandle, 0); // 设置音频时长(可选) MP4SetAudioProfileLevel(fileHandle, 0x15); // 采样率 // 打开音频文件 FILE* audioFile = fopen(audioFileName, "rb"); if (audioFile != NULL) { // 读取音频数据并写入 M4A 文件 while (!feof(audioFile)) { unsigned char buffer[1024]; size_t bytesRead = fread(buffer, 1, sizeof(buffer), audioFile); MP4WriteSample(fileHandle, 1, buffer, bytesRead, MP4_INVALID_DURATION, 0, 1); } fclose(audioFile); } // 关闭文件,保存并释放资源 MP4Close(fileHandle, MP4_CLOSE_DO_NOT_COMPUTE); } int main() { const char* audioFileName = "audio.pcm"; const char* outputFile = "output.m4a"; writeM4AFile(audioFileName, outputFile); return 0; } ``` 上述代码是一个简单的示例,需要根据具体的需求进行适当的修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值