在之前一片博客《 EasyPusher实现安卓Android手机直播推送同步录像功能》(http://blog.csdn.net/jyt0551/article/details/58714595)中,我写到了EasyPusher推送的同时进行本地存储的功能,我们今天来介绍下EasyPlayer保存本地录像的功能。EasyPlayer同样是运用MediaMuxer进行录像的,与EasyPusher不同的是,Player要保存的是远端的音视频码流。目前Player支持对H264格式的视频和AAC格式的音频进行存储。
在前一篇博客 ,音视频码流的metadata,即MediaFormat,是从MediaCodec取出来的。也就是说硬编码库提供了获取音视频的metadata的接口。但是很可惜我们在播放端并没有这样方便的借口可以调用。那MediaFormat对象只能我们手动构建了。
MediaFormat这个类的实现非常简单,它的内部以键值对的形式对音视频的参数进行了封装,并且向外提供了接口以供读写。因而我们可以创建一个MediaFormat对象,并使用特定的参数对其赋值即可。经作者研究发现,在录像时,对于视频流,需要的metadata如下表所示。
数据 | 说明 |
---|---|
KEY_MIME | 视频的MIME,比如video/avc |
width | 宽度 |
height | 高度 |
csd-0 | SPS |
csd-1 | PPS |
对于音频,需要如下信息:
数据 | 说明 |
---|---|
KEY_MIME | 音频的MIME,比如audio/mp4a-latm |
KEY_CHANNEL_COUNT | 通道数 |
KEY_SAMPLE_RATE | 采样率 |
csd-0 | 一些更多的细节信息,比如profile、sample的索引等。参考exoplayer里的音频数据的处理 |
csd-1 | 这个。。更多的细节,就不太清楚了。作者也是参考了exoplayer里面的处理 |
了解了这些基本信息后,接下来我们要做的就是从码流中获取到这些信息,并构建MediaFormat,用来添加Video或Audio Track.
下面是获取到视频相关信息后,添加一个VideoTrack的代码。
// 添加Video Track
MediaFormat format = new MediaFormat()