在Android中,简单的说可以使用MediaMuxer来封装编码后的视频流和音频流到mp4容器中,MediaMuxer从api18开始提供,可以封装编码后的视频流和音频流到视频文件中。
目前MediaMuxer支持的文件输出格式包括MP4,webm和3gp:
格式
构造函数
构造函数
构造函数 |
说明 |
MediaMuxer(String path, int format) |
path:用于存放合成的文件的路径,不能为null;format:输出的文件的格式,OutputFormat中的常量标识。 |
MediaMuxer(FileDescriptor fd, int format) |
Constructor. |
方法
返回值 |
方法名 |
说明 |
int |
addTrack(MediaFormat format) |
添加的格式 |
void |
release() |
主动释放资源 |
void |
setLocation(float latitude, float longitude) |
Set and store the geodata (latitude and longitude) in the output file. |
void |
setOrientationHint(int degrees) |
Sets the orientation hint for output video playback. |
void |
start() |
Starts the muxer. |
void |
stop() |
S暂停 |
void |
writeSampleData(int trackIndex, ByteBuffer byteBuf, MediaCodec.BufferInfo bufferInfo) |
Writes an encoded sample into the muxer. |
1.生成MediaMuxer对象
通过new MediaMuxer(String path, int format)指定视频文件输出路径和文件格式:
MediaMuxer mMediaMuxer = new MediaMuxer(mOutputVideoPath,
MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
2.addTrack
addTrack(MediaFormat format),添加媒体通道,传入MediaFormat对象,通常从MediaExtractor或者MediaCodec中获取,也可以自己创建,后面会有文章说明。
addTrack会返回trackindex,这个index后面会用到。
//开始编码 就会调用一次
MediaFormat outputFormat = mMediaCodec.getOutputFormat();
//配置封装器
// 增加一路指定格式的媒体流 视频
index = mMediaMuxer.addTrack(outputFormat);
3.调用start函数
MediaMuxer.start();
4.写入数据
调用
MediaMuxer.writeSampleData()向mp4文件中写入数据了。每次只能添加一帧视频数据或者单个Sample的音频数据,需要BufferInfo对象作为参数。
BufferInfo.size 必须填入数据的大小
BufferInfo.flags 需要给出是否为同步帧/关键帧
BufferInfo.presentationTimeUs 必须给出正确的时间戳,注意单位是 us,第二次getSampleTime()和首次getSampleTime()的时间差。
//输出缓冲区
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
//MediaCodec下节课介绍
int status = mMediaCodec.dequeueOutputBuffer(bufferInfo, 10_000);
//index是addTrack(outputFormat)返回的
mMediaMuxer.writeSampleData(index, outputBuffer, bufferInfo);
5.释放关闭资源
结束写入后关闭以及释放资源:
MediaMuxer.stop();
MediaMuxer.release();
MediaMuxer基本使用我们学完了,主要是结合MediaCodec一起来使用,后面我们会在来学习MediaCodec来一起使用,来完成编码录制功能。