一个音视频文件是由音频和视频组成的,我们可以通过MediaExtractor、MediaMuxer把音频或视频给单独抽取出来,抽取出来的音频和视频能单独播放
一、MediaExtractor API
MediaExtractor主要用于多媒体文件的音视频数据的分离。
该类主要用于音视频混合数据的分离,接口比较简单,首先要通过setDataSource(String path)函数设置数据源,数据源可以是本地文件地址,也可以使用HTTP协议的网络码流地址。
然后,可以通过下面的代码块,来获取码流的详细信息,如:MimeType,分辨率、编码格式、码率、帧率等等。
主要API介绍:
- setDataSource(String path):即可以设置本地文件又可以设置网络文件
- getTrackCount():得到源文件通道数
- getTrackFormat(int index):获取指定(index)的通道格式
- getSampleTime():返回当前的时间戳
- readSampleData(ByteBuffer byteBuf, int offset):把指定通道中的数据按偏移量读取到ByteBuffer中;
- advance():读取下一帧数据
- release(): 读取结束后释放资源
MediaMuxer API
MediaMuxer的作用是生成音频或视频文件;还可以把音频与视频混合成一个音视频文件。
主要API介绍:
- MediaMuxer(String path, int format):path:输出文件的名称 format:输出文件的格式;当前只支持MP4格式;
- addTrack(MediaFormat format):添加通道;我们更多的是使用MediaCodec.getOutpurForma()或Extractor.getTrackFormat(int index)来获取MediaFormat;也可以自己创建;
- start():开始合成文件
writeSampleData(int trackIndex, ByteBuffer byteBuf, MediaCodec.BufferInfo bufferInfo):把ByteBuffer中的数据写入到在构造器设置的文件中; - stop():停止合成文件
- release():释放资源
示例
使用MediaExtractor&MediaMuxer API提取input.mp4文件中的视频数据,生成除去音频数据之后的纯视频output.mp4文件。
源码地址:https://github.com/Xiaoben336/AnalysisAndPackageMP4.git