安卓mediasoup webrtc h264 编解码相关源码分析

本文详细分析了安卓环境下mediasoup和webrtc对于H264视频编码的支持流程,包括如何启用H264编码,视频采集流程,以及编码器和解码器的初始化。在mediasoup中,虽然安卓默认不支持H264,但可以通过修改编译参数启用。同时,文中探讨了为何mediasoup在安卓上未使用H264硬编解码,并给出了相关源码分析。对于webrtc,文章展示了VideoStreamEncoder的初始化和编码过程,以及如何创建和初始化H264Encoder和Decoder。此外,还介绍了如何通过修改代码支持更多的硬件编码器前缀来增强H264硬件编码的兼容性。

本文首发地址 https://h89.cn/archives/250.html
最新更新地址 https://gitee.com/chenjim/chenjimblog
本文基于libmediasoupclient 3.2.0 和 webrtc branch-heads/4147(m84)
本文得熟悉相关基础,参考 文1文2

mediasoup H264 支持

  • 打开 rtc_use_h264
    webrtc.gni 中可以看到如下,也就是安卓默认不支持 h264
    rtc_use_h264 = proprietary_codecs && !is_android && !is_ios && !(is_win && !is_clang)
    可以将此处改为 true ,也可以带上编译参数 'rtc_use_h264=true,如下:
    ./tools_webrtc/android/build_aar.py --extra-gn-args 'rtc_use_h264=true'

  • mediasoup-demo-android 的 forceH264
    通过代码我们看到,这个参数只在 UrlFactory.java 中拼接地址使用
    正常情况 如果 url 中 有forceH264=true, 就应该采用H264编码
    如浏览器输入 https://v3demo.mediasoup.org/?forceH264=true&roomId=123456 输出的视频就是H264
    (安卓默认显示黑屏,缺少H264解码器,另文 解决)
    但是 mediasoup-demo-android 菜单勾选forceH264了还是 VP8 编码,算是个BUG …


安卓 webrtc 视频采集流程源码分析

webrtc针对视频采集对外主要提供的是VideoCapturer接口,实现类有ScreenCapturerAndroid、FileVideoCapturer和CameraCapturer,分别表示屏幕、文件、摄像头三种不同的视频来源,因为android系统先后提供了camera1.0和camera2.0接口,因此CameraCapturer又用Camera1Capturer和Camera2Capturer两个子类分别表示。
主要类图

视频采集和分发流程如下图

更多细节可以参考原文 webrtc源码分析之视频采集之一, 感谢 Jimmy2012


安卓 mediasoup 为啥没有使用H264硬编解码

  1. 安卓 mediasoup Java层 CreateMediaEngine 如下
    mediasoup-demo-android\app\src\main\java\org\mediasoup\droid\lib\PeerConnectionUtils.java
    VideoEncoderFactory encoderFactory = new DefaultVideoEncoderFactory( mEglBase.getEglBaseContext(), true /* enableIntelVp8Encoder */, true);
    VideoDecoderFactory decoderFactory = new DefaultVideoDecoderFactory(mEglBase.getEglBaseContext());
    mPeerConnectionFactory = builder.setAudioDeviceModule(adm)
            .setVideoEncoderFactory(encoderFactory)
            .setVideoDecoderFactory(decoderFactory)
            .createPeerConnectionFactory();

大致跟 AppRTCDemo PeerConnectionClient.java 相同,AppRTCDemo 支持H264软硬编解码
其中 .createPeerConnectionFactory(); 相关流程如下

--> createPeerConnectionFactory()  
--> JNI_PeerConnectionFactory_CreatePeerConnectionFactory(...)   
(webrtc/src/sdk/android/src/jni/pc/peer_connection_factory.cc)   
--> CreatePeerConnectionFactoryForJava(...) (webrtc/src/sdk/android/src/jni/pc/peer_co
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清霜辰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值