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
相关产品推荐
相关产品推荐

