首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Sinch中禁用视频

问如何在Sinch中禁用视频
EN

Stack Overflow用户
提问于 2016-06-09 16:10:56
回答 1查看 264关注 0票数 0

我正在使用辛奇实现视频聊天,但一旦通话启动,我就找不到禁用传出视频的方法。

这在什么地方有记录吗?

如果SDK不支持它,是否有一种“拦截”视频流并阻止其发送的方法(甚至是恶意的方法)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-13 16:49:59

很明显,在SDK中没有官方的方法可以做到这一点,但是这里有一个黑客,正如预期的那样工作。

长话短说,通过一些运行时的“魔法”,我们可以拦截由Sinch发起的AVCaptureSessoin并控制它。

下面是操作步骤:

代码语言:javascript
复制
extension AVCaptureSession {
  public override class func initialize() {
    struct Static {
      static var token: dispatch_once_t = 0
    }

    // make sure this isn't a subclass
    if self !== AVCaptureSession.self {
      return
    }

    dispatch_once(&Static.token) {
      let originalSelector = #selector(AVCaptureSession.init)
      let swizzledSelector = #selector(AVCaptureSession.hd_init)

      let originalMethod = class_getInstanceMethod(self, originalSelector)
      let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

      let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))

      if didAddMethod {
        class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
      } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
      }
    }
  }

  @nonobjc static var hd_currentSession: AVCaptureSession? = nil

  func hd_init() {
    hd_init() // at runtime this is the original `init` implementation
    AVCaptureSession.hd_currentSession = self
  }

}

一个简单的解释:第一部分只是两个方法的基本的运行时处理,并不是特定于这个实现的。

也就是说,我们要用自己的AVCaptureSession.hd_init替换AVCaptureSession.hd_init的实现(hd只是任何前缀,以避免方法名称的潜在冲突)。

注意事项 在hd_init,我们给hd_init打电话。这有点令人费解,但这就是swizzling的工作原理:在我们执行这段代码时,hd_init已经被原始的init所取代,所以我们实际上是在调用原始实现,这正是我们想要的。

init的自定义实现只是为了存储对实例的静态引用,我们将称之为hd_currentSession。

我们就完了!

现在,在应用程序中的任何地方,我们都可以获得对当前AVCaptureSession的引用,并随意停止/启动它。

例如

代码语言:javascript
复制
func toggleVideo() {
  if let session = AVCapture.hd_currentSession {
    if session.running {
      session.stopRunning()
    } else {
      session.startRunning()
    }
  }  
}

在Sinch视频流启动后的任何时候,我们都可以简单地调用toggleVideo()

警告 停止捕获会话将导致视频“冻结”到最后一帧。我还没有在iOS端解决这个问题,但我注意到在Javascript中,您可以在视频MediaTrack上看到一个"muted"事件。有鉴于此,您可以--例如--使用onmuted事件在另一个客户端隐藏视频。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37731221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档