Android MediaCodec 同步和异步两种方式简单说明

MediaCodec 是 Android 提供的音视频编解码类,支持同步和异步两种工作模式。它们的主要区别体现在数据的提交(输入)与获取(输出)流程上。


一、同步方式(Synchronous Mode)

特点:

  • 主动轮询 MediaCodec,通过阻塞式 API 处理输入输出。

  • 编码或解码过程在调用线程中完成,逻辑清晰,但效率相对较低。

常用 API:

int inputBufferIndex = codec.dequeueInputBuffer(timeoutUs);
ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferIndex);
// 填入数据后
codec.queueInputBuffer(inputBufferIndex, offset, size, presentationTimeUs, flags);

int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, timeoutUs);
if (outputBufferIndex >= 0) {
    ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferIndex);
    // 处理输出数据
    codec.releaseOutputBuffer(outputBufferIndex, render);
}

优点:

  • 实现简单,易于调试。

  • 更适合短时任务或对性能要求不高的场景。

缺点:

  • 需要频繁轮询,阻塞线程,耗 CPU。

  • 线程和资源占用高,不适合复杂场景如直播、屏幕录制等。


二、异步方式(Asynchronous Mode)

特点:

  • 使用回调接口处理输入输出。

  • 编码解码过程异步触发,更高效地利用 CPU 和系统资源。

启用方式:

MediaCodec.Callback callback = new MediaCodec.Callback() {
    @Override
    public void onInputBufferAvailable(MediaCodec codec, int index) {
        ByteBuffer inputBuffer = codec.getInputBuffer(index);
        // 填充数据
        codec.queueInputBuffer(index, offset, size, presentationTimeUs, flags);
    }

    @Override
    public void onOutputBufferAvailable(MediaCodec codec, int index, MediaCodec.BufferInfo info) {
        ByteBuffer outputBuffer = codec.getOutputBuffer(index);
        // 处理输出
        codec.releaseOutputBuffer(index, render);
    }

    @Override
    public void onError(MediaCodec codec, MediaCodec.CodecException e) {
        // 错误处理
    }

    @Override
    public void onOutputFormatChanged(MediaCodec codec, MediaFormat format) {
        // 格式变化处理
    }
};

codec.setCallback(callback);
codec.configure(...);
codec.start();

优点:

  • 非阻塞,效率高。

  • 适合高性能任务(如屏幕录制、直播、实时通信等)。

  • 更好地利用多线程并行处理。

缺点:

  • 实现复杂,回调逻辑容易出错。

  • 对线程安全有更高要求。


总结对比:

项目同步模式异步模式
工作方式主动轮询回调处理
是否阻塞
性能一般
实现难度简单稍复杂
适合场景本地录制、离线任务等屏幕录制、直播、实时通信等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青青的番茄饲养员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值