概述
想写一篇分析webrtc源码的文章,梳理了半天,发现webrtc太大了,不知道从哪里开始。那就先从android源码开始吧,纯手打,如有不对之处,请及时指正。
java层代码分析
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");
}
会被srcsdkandroidsrcjnipcpeer_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
所有视频相关的处理逻辑
最后
以上就是眯眯眼紫菜为你收集整理的开源webrtc源码分析java层代码分析编译脚本分析源码目录分析的全部内容,希望文章能够帮你解决开源webrtc源码分析java层代码分析编译脚本分析源码目录分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复