美文网首页MediaCodec
Android音视频之MediaMuxer

Android音视频之MediaMuxer

作者: 张小潇 | 来源:发表于2020-03-18 23:49 被阅读0次

在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来一起使用,来完成编码录制功能。

相关文章

网友评论

    本文标题:Android音视频之MediaMuxer

    本文链接:https://www.haomeiwen.com/subject/cnihyhtx.html