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

前言:

    mp4文件目前已经成为了流媒体音视频行业的通用标准文件格式,它是基于mov格式基础上演变来的,特别适合多平台播放,录制一次,多个平台都可使用。但是,由于mp4格式相对比较复杂,直到mp4v2这个开源工程的出现,解决了这个问题。

    通常,我们在使用mp4文件时,会遇到两个问题:如何从已有的mp4文件中抽取音视频数据帧;如何将音视频数据帧录制成mp4文件,并保持音视频同步。

    上一篇文章已经使用mp4v2从mp4文件中抽取音视频数据帧(文章),本篇文章讲述如何将音视频数据帧(AAC+H264)保存成mp4文件,并保持音视频同步。

源码下载:

    优快云:https://download.youkuaiyun.com/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);
	// 调用封装接口,直接创建视频轨道...
	return m_lpRecMP4->CreateVide
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值