Android WebRTC踩坑指南

三味码屋 2021年09月29日 2,378次浏览

1. setRemoteDescription错误:

Session error code: ERROR_CONTENT. Session error description: Failed to set remote video description send parameters for m-section with mid='1'..

原因:

视频编码问题导致Android端无法正常解析sdp内容

解决方案:

创建PeerConnectionFactory实例时配置视频编码相关参数,开启Vp8H.264视频编码,如下:

override fun initPeerConnectionFactory() {
    val eglBaseContext = EglBase.create().eglBaseContext
    val initializationOptions = InitializationOptions
        .builder(context)
        .createInitializationOptions()
    PeerConnectionFactory.initialize(initializationOptions)
    val options = PeerConnectionFactory.Options()
    val defaultVideoEncoderFactory = DefaultVideoEncoderFactory(eglBaseContext, true, true)
    val defaultVideoDecoderFactory = DefaultVideoDecoderFactory(eglBaseContext)
    peerConnectionFactory = PeerConnectionFactory.builder()
        .setOptions(options)
        .setVideoEncoderFactory(defaultVideoEncoderFactory)
        .setVideoDecoderFactory(defaultVideoDecoderFactory)
        .createPeerConnectionFactory()
}

2. Google Android WebRTC库并不是向后兼容的

通过集成不同版本的Google Android WebRTC库会发现,新版本库中的API是不兼容旧版本库的,例如下面这段创建PeerConnectionFactory实例的代码:
WebRTC 1.0.32006版本:

fun initPeerConnectionFactory() {
    PeerConnectionFactory.initialize(initializationOptions)
    peerConnectionFactory = PeerConnectionFactory
        .builder()
        .createPeerConnectionFactory()
}

WebRTC 1.0.20723版本:

fun initPeerConnectionFactory() {
    PeerConnectionFactory.initialize(initializationOptions)
    peerConnectionFactory = PeerConnectionFactory(PeerConnectionFactory.Options())
}

1.0.20723版本直接通过构造方法创建PeerConnectionFactory实例,到了1.0.32006版本PeerConnectionFactory的构造方法已经被私有化,因此不再支持通过构造方法直接创建实例,而是通过PeerConnectionFactory.Builder创建。
所以当升级WebRTC库的版本时,务必做好适配工作。