开源webrtc源码分析

news/2024/7/8 4:13:05

想写一篇分析webrtc源码的文章,梳理了半天,发现webrtc太大了,不知道从哪里开始。那就先从android源码开始吧,纯手打,如有不对之处,请及时指正。

java层代码分析

android代码目录
api目录:提供android端可以直接调用的API。
src目录:提供Camera,MediaCodec等更细节的一些java层封装。
api目录下的文件会调用src目录下的文件。

每一个java类都通过jni映射与C++的源码进行对应,例如PeerConnectionFactory.java中的onWorkerThreadReady()接口

@CalledByNative
private void onWorkerThreadReady() {
  workerThread = ThreadInfo.getCurrent();
  staticWorkerThread = workerThread;
  Logging.d(TAG, "onWorkerThreadReady");
}

会被src\sdk\android\src\jni\pc\peer_connection_factory.cc调用

PostJavaCallback(env, owned_factory->worker_thread(), RTC_FROM_HERE, j_pcf,
                 &Java_PeerConnectionFactory_onWorkerThreadReady);

编译脚本分析

看一下BUILD.gn这个编译脚本

if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")
  import("../../webrtc.gni")

  group("android") {
    if (!build_with_chromium && is_android) {
      public_deps = [
        ":libjingle_peerconnection_jni",
        ":libjingle_peerconnection_so",
        ":libwebrtc",
        ":native_api",
      ]
    }
  }
  
。。。

rtc_shared_library("libjingle_peerconnection_so") {
  sources = [
    "src/jni/jni_onload.cc",
  ]

  suppressed_configs += [ "//build/config/android:hide_all_but_jni_onload" ]
  configs += [ "//build/config/android:hide_all_but_jni" ]

  deps = [
    ":libjingle_peerconnection_jni",
    ":libjingle_peerconnection_metrics_default_jni",
    "../../pc:libjingle_peerconnection",
    "../../rtc_base",
  ]
  output_extension = "so"
}

我们使用的libjingle_peerconnection_so.so的库是根据这个文件src/jni/jni_onload.c生成的,该文件会把webrtc::jni这个命名空间下的代码打进.so库。
此外,这个BUILD.gn脚本会把一些java文件打成jar包,供开发者调用。

rtc_android_library("base_java") {
  java_files = [
    "api/org/webrtc/RefCounted.java",
    "api/org/webrtc/Predicate.java",
    "src/java/org/webrtc/CalledByNative.java",
    "src/java/org/webrtc/CalledByNativeUnchecked.java",
    "src/java/org/webrtc/Histogram.java",
    "src/java/org/webrtc/JniCommon.java",
    "src/java/org/webrtc/JniHelper.java",
    "src/java/org/webrtc/RefCountDelegate.java",
    "src/java/org/webrtc/WebRtcClassLoader.java",
  ]

  deps = [
    "//rtc_base:base_java",
    "//third_party/android_deps:com_android_support_support_annotations_java",
  ]
}

上面是base_java.jar的编译配置。

源码目录分析

源码目录

  • audio
    所有音频相关的处理逻辑,包括音频流发送、接收,通道数据的发送、接收,以及音频混合和重采样相关逻辑。
  • base
    很多基础的功能都提取到这个目录,如josn解析、构造,md5的生成,进程处理的逻辑,时间相关处理,字符串的转化等。这些可以分拆出来,放到被的项目只用,也是可以的。
  • call
    webrtc流发送和接收,rtp和rtcp交互的逻辑处理。
  • common_audio
    提取音频的一些通用功能,如VAD算法、音频转换、重采样、WAV格式封装、ring_buffer的封装等。
  • common_video
    提取视频的一些通用功能,如H264、libyuv等。
  • data
  • examples
    webrtc提供的示例代码。
  • media
    媒体相关的功能。
  • modules
    包括音频编解码,音频设备的适配,音频的混和,比特率控制,拥塞控制,截屏,rtp和rtcp协议,视频录制,视频编码,视频处理等功能模块。
  • p2p
    点对点交互设计的功能代码实现。
  • pc
    PC端功能的代码实现,主要功能与android端相同,实现语言由JAVA改为了C++。
  • resources
    源码使用的非代码相关的测试文件或者配置等。
  • rtc_base
    webrtc跨平台的基础库,它提供了线程、网络、内存、指针等多个方面
  • rtc_tools
    其他的一些工具,如视频帧比较,I420转RGB,视频帧分析。
  • sdk
    为android和ios提供的sdk封装,移动端webrtc通话的主要源码目录。
  • stats
    存放各种数据统计相关的类。
  • tools_webrtc
    提供一些python脚本工具
  • video
    所有视频相关的处理逻辑

http://www.niftyadmin.cn/n/3656197.html

相关文章

php中session常用函数

session_start() 该函数表明本页需要使用session,如果不使用该函数,将有可能导致其他函数和session变量无法正常使用,类似于初始化函数。 session_register() 该函数用于注册普通变量为Session变量,如 $a1; session_register(&quo…

U盘无法识别

之前用U盘启动装centos 系统 ,把一个centos7.2的系统刻录到了一个8G的U盘,之后是centos安装成功了 ,却发现在windows下不认识U盘了。 解决方法如下(在linux下操作): 查看U盘加载文件 fdisk -l先卸载掉 um…

kurento服务器搭建

Kurento media server服务搭建一、下载ubuntu18.04服务器1、安装gunpg2、确定ubuntu版本3、设置变量4、添加key5、设置kurento.list6、安装kurento media server7、启动/停止/状态/重启二、kurento tutorial java服务搭建三、kurento相关配置1、Kurento Media Server 日志2、Ku…

《精通.Net核心技术》

共两册 《精通.Net核心技术——原理与架构》 价格不明 《精通.Net核心技术——高级特性》 价格:79(附光盘) 飞思科技产品研发中心编著 电子工业出版社

check_stun_auth: user cece credentials are incorrect

记录部署coturn服务器的一个问题,coturn的部署记录可参考https://blog.csdn.net/Martin_chen2/article/details/101641584: coturn服务器部署后,执行turnserver -a -f -usercece:123456 -r Guangdong后,运行移动端demo&#xff0…

php安装配置

IIS环境我们以php安装目录c:/php为例,首先找到c:/php/sapi/php4ts.dll文件,拷贝到windows系统目录(WindowsXP中为%windows%/system32目录)。 在IIS中添加文件关联,将.php文件映射到c:/php/sapi/php4isapi.dll。 然后编…

ffmpeg 音频 变声

记录一次ffmpeg编码变声的根本原因: 音频源采样率和ffmpeg编码时的采样率不同,音频源在采集是采样率为48000,而编码时用44100,所以播放出来的声音显得宽厚、是真。