webRTC 原生 Android 应用程序是不是需要特定的线程模型

Posted

技术标签:

【中文标题】webRTC 原生 Android 应用程序是不是需要特定的线程模型【英文标题】:Is a particular threading model required for webRTC native Android appwebRTC 原生 Android 应用程序是否需要特定的线程模型 【发布时间】:2016-07-11 12:25:46 【问题描述】:

首先,我不清楚引用其他代码的链接是否合适,如果合适,我很抱歉,并想了解在我引用库的这种情况下更合适的机制(这些链接主要作为参考提供给相关方)。

我们有一个适用于 android 的 webrtc 本机应用程序,在调用 peerconnectionfactory 的处置时遇到了困难。当用户选择结束活动会话时,我们有一个清理例程关闭对等连接,然后释放它(尽管关闭并不是真正必要的,因为对 dispose 的调用也会在释放其他资源之前关闭连接 - 例如,例如流和本机观察者 - 参见 libjingle - talk/app/webrtc/java/src/org/webrtc/PeerConnection.java )。在我们的例子中,peerconnectionfactory 的创建是由一个通过 runnable 创建的线程执行的,而工厂的 dispose 是从主 UI 线程执行的。

这是我们遇到问题的地方 - 即,当尝试处理 peerconnectionfactory 时,应用程序崩溃了。

在查看与 webRTC 演示代码相关的帖子时(请参阅 https://chromium.googlesource.com/external/webrtc/+/master/webrtc/examples/androidapp/src/org/appspot/apprtc),他们似乎没有这个问题。

此外,在查看对等连接工厂实现的本机代码时(请参阅https://code.google.com/p/chromium/codesearch#chromium/src/third_party/webrtc/api/peerconnectionfactory.cc 中的 peerconnectionfactory.cc),我们看到对等连接工厂析构函数的工作线程的解包和删除。

此外,在查看 chromium webrtc 问题列表时,我们发现有几个问题(例如,https://bugs.chromium.org/p/webrtc/issues/detail?id=3100 或 4196)导致人们认为需要特别注意在以下情况下使用的线程/循环模型:使用 peerconnectionfactory。

所以,我的基本问题是,从与处理它的线程不同的线程创建 peerconnectionfactory 时是否存在问题,以及管理 peerconnectionfactory 是否存在一组特定的线程/循环要求。

谢谢,

【问题讨论】:

【参考方案1】:

所以,事实证明线程不是问题,尽我所能告诉通过代码进行跟踪等。问题是我们有一个实现 SDPObserver、PCObserver 和 DataObserver 的私有类以及其他一些逻辑。

这样做的结果是,当初始化对等连接时,实现所有观察者(和一些其他逻辑)的类作为观察者传递,并在 libjingle 中记录为本地观察者,因此,调用处理 peerconnection 导致本地观察者被释放,这不仅导致 PCObserver 被释放(在 libjingle peerconnection.dispose() 中),而且因为对我们来说,它是同一个类,所有东西都被释放 - 导致当假定其他类仍然存在时崩溃。

因此,为每个观察者重新设计了单独的私有类,并正确地将适当的观察者传递给对等连接创建(以及适用于不同调用的 sdp/数据观察者),然后一切正常 - 处置只是释放 PCObserver,一切都是不错。

【讨论】:

以上是关于webRTC 原生 Android 应用程序是不是需要特定的线程模型的主要内容,如果未能解决你的问题,请参考以下文章

WebRTC原生开发和混合开发优缺点分析对比

Android 旧版本是不是支持 Android 应用中的 Webrtc 视频聊天

是否可以将 Google Hangouts 原生集成到 Android 应用程序中?

将官方 WebRTC SDK 集成到 Android / iOS APP 的文档/示例

android webRTC语音通话

WebRTC手记之本地音频采集