Android MediaMuxer合成视频文件

#.简介
        MediaMuxer在Android中可以将编码后的视频、音频数据封装后输出为多媒体文件,支持的文件输出格式包括MP4,webm和3gp。不过MediaMuxer中最多只能添加一条视轨和一条音轨。
        一般音视频编码由MediaCodec负责,而MediaMuxer处理MediaCodec输出的编码数据,合成多媒体文件。
#主要API
1.public MediaMuxer(@NonNull String path, @Format int format)
设置输出文件路径 和 输出文件的媒体格式
2.addTrack(mediaFormat)
添加多媒体轨道。
在MediaCodec获取输出缓冲区索引bufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED时,可以去获取MediaCodec输出的媒体格式:MediaFormat mediaFormat = mEncoder.getOutputFormat();
并为MediaMuxer添加对应媒体格式的轨道。
3.start()
开启混合器
4.writeSampleData(int trackIndex, ByteBuffer byteBuf, BufferInfo bufferInfo)
处理媒体数据,三个参数依次为:轨道号、数据缓冲区、缓冲区配置信息。
后两者可以从MediaCodec的输出缓冲数据获取到。
5.stop()
关闭混合器
6.release()
释放实例和对应资源
#处理音视频数据代码示例:
其实就是不停调用writeSampleData(int trackIndex, ByteBuffer byteBuf, BufferInfo bufferInfo)来处理MeidaCodec输出的编码数据。
(这里为MediaCodec的输出数据自定义了一个封装类,以下audio、video都是该封装类对象)
if (null != audio) {
    ByteBuffer buffer = ByteBuffer.wrap(audio.data);
    MediaCodec.BufferInfo info = audio.info;
    //若对应帧包含的是编码器控制信息,则合成器不需要处理
    if ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
        buffer = null;
    }
    if (null != buffer && info.size > 0) {
        buffer.position(info.offset);
        buffer.limit(info.offset + info.size);
        try {
            mMuxer.writeSampleData(mAudioTrack, buffer, info);
        } catch (Exception e) {
            //.......进行相关处理........
        }
    }
}

if (null != video) {
    ByteBuffer buffer = ByteBuffer.wrap(video.data);
    MediaCodec.BufferInfo info = video.info;
    //若对应帧包含的是编码器控制信息,则合成器不需要处理
    if ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
        buffer = null;
    }
    if (null != buffer && info.size > 0) {
        buffer.position(info.offset);
        buffer.limit(info.offset + info.size);
        try {
            mMuxer.writeSampleData(mVideoTrack, buffer, info);
        } catch (Exception e) {
            //.......进行相关处理........
        }
    }
}

猜你喜欢

转载自blog.csdn.net/u013914309/article/details/124721366