Bento4库使用(1):读取MP4文件视频和音频裸数据

Bento4库使用(1):读取MP4文件视频和音频裸数据

1、建立输入流

input_filename为读取的MP4文件名。

AP4_ByteStream* input_stream = NULL;
result = AP4_FileByteStream::Create(input_filename, 
                                        AP4_FileByteStream::STREAM_MODE_READ, 
                                        input_stream);

2、获取数据

AP4_File input_file(*input_stream, true);
AP4_Movie *movie = input_file->GetMovie();

AP4_List<AP4_Track>& tracks = movie ->GetTracks();
int index = 0;
AP4_SampleDescription *sample_des;

for (AP4_List<AP4_Track>::Item* track_item = tracks.FirstItem();
	index<tracks.ItemCount();track_item = track_item->GetNext(),++index)
{
		AP4_Track *track = track_item->GetData();
		if (track->GetType() == AP4_Track::TYPE_VIDEO)                     //视频轨道处理
		{
			Width = (float)track->GetWidth()/65536.0;
			Height = (float)track->GetHeight()/65536.0;
			VideoSampleNum = track->GetSampleCount();
			VideoTrackId = track->GetId();
			sample_des = track->GetSampleDescription(0);
			stream_type = sample_des->GetFormat();
			const char *track_format = AP4_GetFormatName(stream_type);       //获得视频编码格式
			VideoType = track_format;
			//此处可根据视频编码类型获取SPS、PPS、VPS等数据
			VideoFrameRate = track->GetSampleCount()/((float)track->GetMediaDuration()/(float)track->GetMediaTimeScale());
			VideoTimeScale = track->GetMovieTimeScale();
		}
		else if(track->GetType() == AP4_Track::TYPE_AUDIO )   //音频轨道
		{
			LocalAudioTrackId = track->GetId();
			sample_des = track->GetSampleDescription(0);
			LocalAudioSampleNum = track->GetSampleCount();
			LocalAudioMaxTime = track->GetDurationMs();
			LocalAudioTimeScale = track->GetMediaTimeScale();
		}
}

3、读取一帧数据

根据上面获得的track id区分读取的是视频数据还是音频数据,sample存放的即帧数据,sampleId为序号:

AP4_Track *track = movie.GetTrack(TrackId);
AP4_Sample sample;
AP4_DataBuffer sample_data;
AP4_Result result = track->ReadSample(SampleId++,  sample,  sample_data);

注意

上面读取的帧数据是直接从MP4中获取的,因此读取的音频数据若是aac格式,是不包含ADTS头的,若需要读取的数据可正常播放,需要自己为每一帧添加ADTS头。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值