開源webrtc源碼分析

想寫一篇分析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
    所有視頻相關的處理邏輯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章