You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android端WebRTC如何指定偏好编解码器,优先启用VP9?

WebRTC Android M90版本设置VP9为优先编解码器方案

核心逻辑

WebRTC Android端的编解码器协商优先级,由VideoEncoderFactory接口getSupportedCodecs()方法返回的列表顺序决定,列表中排在前面的编解码器会被优先选择。我们只需自定义编码器工厂调整返回列表的顺序,将VP9放在首位即可实现需求。

实现步骤

1. 自定义优先级视频编码器工厂

包装系统默认的DefaultVideoEncoderFactory,调整支持的编码列表顺序:

public class PriorityVideoEncoderFactory implements VideoEncoderFactory {
    private final DefaultVideoEncoderFactory defaultFactory;

    public PriorityVideoEncoderFactory(EglBase.Context eglContext, boolean enableHardwareCodec, boolean enableFlexfec) {
        defaultFactory = new DefaultVideoEncoderFactory(eglContext, enableHardwareCodec, enableFlexfec);
    }

    @Override
    public VideoEncoder createEncoder(VideoCodecInfo codecInfo) {
        // 直接使用默认工厂的创建逻辑,无需修改
        return defaultFactory.createEncoder(codecInfo);
    }

    @Override
    public VideoCodecInfo[] getSupportedCodecs() {
        List<VideoCodecInfo> originalCodecs = new ArrayList<>(Arrays.asList(defaultFactory.getSupportedCodecs()));
        List<VideoCodecInfo> sortedCodecs = new ArrayList<>();
        
        // 优先把所有VP9编码配置放到列表最前
        for (VideoCodecInfo codec : originalCodecs) {
            if (codec.name.equalsIgnoreCase("VP9")) {
                sortedCodecs.add(codec);
            }
        }
        // 剩余编码保持原有顺序追加到列表
        for (VideoCodecInfo codec : originalCodecs) {
            if (!codec.name.equalsIgnoreCase("VP9")) {
                sortedCodecs.add(codec);
            }
        }
        return sortedCodecs.toArray(new VideoCodecInfo[0]);
    }
}

2. 替换PeerConnectionFactory的默认编码器工厂

初始化PeerConnectionFactory时,使用我们自定义的编码器工厂替换系统默认实现:

// 示例代码,结合你自己的初始化逻辑调整
EglBase eglBase = EglBase.create();
PeerConnectionFactory.Builder factoryBuilder = PeerConnectionFactory.builder()
        // 替换为自定义的编码器工厂
        .setVideoEncoderFactory(new PriorityVideoEncoderFactory(eglBase.getEglBaseContext(), true, true))
        // 解码器如果也需要优先VP9,可以用同样逻辑自定义VideoDecoderFactory后替换
        .setVideoDecoderFactory(new DefaultVideoDecoderFactory(eglBase.getEglBaseContext()));
PeerConnectionFactory peerConnectionFactory = factoryBuilder.createPeerConnectionFactory();

补充说明

  • 如果需要同时调整解码侧的VP9优先级,可按照相同逻辑自定义VideoDecoderFactory,调整getSupportedCodecs()的返回顺序即可。
  • M90版本的VP9硬件编解码能力依赖设备硬件支持,若设备不支持VP9硬编,WebRTC会自动回退到VP9软编,无需额外适配。
  • 若要强制仅使用VP9编码,可在调整顺序的逻辑中过滤掉非VP9的编码配置,仅保留VP9相关的VideoCodecInfo项即可。

内容的提问来源于stack exchange,提问作者dchappelle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:15:03