在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. |
使用过程介绍:
-
生成MediaMuxer对象
通过new MediaMuxer(String path, int format)指定视频文件输出路径和文件格式:MediaMuxer mMediaMuxer = new MediaMuxer(mOutputVideoPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
-
addTrack
addTrack(MediaFormat format),添加媒体通道,传入MediaFormat对象,通常从MediaExtractor或者MediaCodec中获取,也可以自己创建,后面会有文章说明。
addTrack会返回trackindex,这个index后面会用到。//开始编码 就会调用一次 MediaFormat outputFormat = mMediaCodec.getOutputFormat(); //配置封装器 // 增加一路指定格式的媒体流 视频 index = mMediaMuxer.addTrack(outputFormat);
-
调用start函数
MediaMuxer.start();
-
写入数据
调用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);
-
释放关闭资源
结束写入后关闭以及释放资源:MediaMuxer.stop(); MediaMuxer.release();
总结:
MediaMuxer基本使用我们学完了,主要是结合MediaCodec一起来使用,后面我们会在来学习MediaCodec来一起使用,来完成编码录制功能。