IOS新手进阶

Vonage Video框架解析(一)—— 应用中添加一个实时视

2021-05-19  本文已影响0人  刀客传奇

版本记录

版本号 时间
V1.0 2021.05.19 星期三

前言

Vonage Video框架是提供直播流服务的一个平台,接下来这几篇就主要对这个框架进行介绍和讲解。

开始

首先看下主要内容:

开始使用Vonage Video API,并将实时视频流添加到您的iOS应用。内容来自翻译

接着看下写作环境:

Swift 5, iOS 14, Xcode 12

下面就是正文啦。

现场直播体验,例如由Vonage Video API提供支持的体验,涵盖了从课堂到音乐会再到咨询的所有内容。 但是这些东西有什么共同点? 没错 —— 缺茶。 是时候有人构建了一个用于主持虚拟茶话会的应用了。 在本教程中,您将构建一个双向直播应用程序,与朋友一起举办虚拟茶话会。 多么令人愉快!

当然,构建实时流服务器和关联的API并非易事。 幸运的是,已经有一些直播平台已经为您完成了这项工作。 其中之一就是VonageVideo API

在您的应用程序中使用此API时,您将了解WebRTC,HLSRTMP的含义以及如何:

现在开始了。

Vonage Video API提供了一个称为OpenTokSDK,可通过CocoaPods安装。 它为框架创建一个单独的项目,并将其与主项目进行分组以在workspace中使用。

入门项目已预安装OpenTok。 打开TeaParty.xcworkspace来访问启动项目。

代码和storyboard已经提供了该应用程序的界面。 由于您将使用相机和麦克风,因此它们的权限说明已在Info.plist中预定义。

构建并运行。 您会在屏幕中央看到一个大按钮,Enter Lounge

您可以在休息室(lounge)与朋友一起直播。 点击Enter Lounge按钮:

轻微问题 —— 完全是黑色,没有任何视频流的迹象!您的任务是添加实时流功能。


Livestreaming Technologies

Vonage Video API允许多达3,000个并发连接之间的实时通信。它使用称为WebRTC的开源多平台框架。

对于WebRTC不够的情况(例如非交互式广播)或您需要超过3,000个连接的情况,Vonage提供了以下替代技术:

由于您不打算举办3001人的茶话会,因此您无需担心这些其他广播技术 —— 或购买大量的茶!


Creating Your Vonage Video API Account and Project

打开StreamingViewController.swift,您会在顶部注意到三个空属性:apiKey,sessionIdtoken。您需要这些凭据才能通过Vonage Video API进行身份验证。

通过在Vonage网站上注册signing up一个免费帐户来检索这些内容。

注册,登录并输入帐户名后,您将看到Vonage Video API帐户门户。这有很多用途,包括:

Vonage Video API是一项付费服务,但是它提供了免费的信用额,可以帮助您入门。

首先从左侧边栏中选择Create Project

接下来,选择Vonage Video API部分下方的Create Custom Project

然后,添加一个project name并选择VP8作为首选编解码器:

在流式传输视频时,编解码器会对摄像机的视频输出进行编码,以将其输出到整个网络,然后对视频进行解码,以将其显示在设备的屏幕上。 Vonage提供了两种编解码器:

在这种情况下,您会选择VP8,因为您可能会在生产应用中使用VP8,该应用可举办大型茶话会,并且来自不同设备的连接也更多(蛋糕也更多)。

单击Create,然后复制生成的API key

在您的Xcode项目中,打开StreamingViewController.swift并将您的API key粘贴到apiKey中:

1. Creating a Session

现在,回到Vonage Video API帐户门户,单击View Project,然后向下滚动到Project Tools部分:

您将在此处创建session ID and token。正如网站所解释的,session ID标识唯一的OpenTok会话。您可以将Tea Party应用程序中的休息室视为一个session

创建会话时,您可以使用Media Mode来指定会话中的客户端如何发送其视频流。有两种选择:

对于此应用程序,选择Routed作为Media Mode,然后单击Create Session ID。与使用API key一样,将给定的session ID复制粘贴到StreamingViewController.swift中的sessionId中。

2. Generating the Token

token可验证每个用户的身份。在生产应用程序中,每个用户将拥有由服务器生成的自己的唯一token。但是,为简单起见,您将为该项目的每个用户使用相同的令牌。

每个token都有一个与之关联的角色role,该角色确定连接到会话的客户端的功能。有三个可能的角色:

在帐户门户的token生成部分中,粘贴您的session ID,然后将Role设置为Publisher,并将Expiration Time设置为30 days。在这种情况下,Connection Data字段应为空。在正式版应用中,您通常会使用它来传递用户ID,名称或其他数据来描述用户。

接下来,单击Generate token ,然后将结果复制粘贴到StreamingViewController.swift中的token中:

现在,您具有身份验证所需的凭据,并开始使用Vonage Video API流式传输您的虚拟茶话会。 现在该把水壶了!


Connecting to the Session

开始直播之前,您需要连接到会话。

为此,请转到StreamingViewController.swift。 在token属性下,添加以下内容:

private var session: OTSession?

OpenTok使用OTSession代表您的会话。 在这里,您将对会话对象保持强引用。

现在,要连接到会话,请在leave()下面添加以下代码:

private func connectToSession() {
  // 1
  session = OTSession(
    apiKey: apiKey,
    sessionId: sessionId,
    delegate: self
  )

  // 2
  var error: OTError?
  session?.connect(withToken: token, error: &error)

  // 3
  if let error = error {
    print("An error occurred connecting to the session", error)
  }
}

这是正在发生的事情:

由于您将OTSession的委托设置为self,因此您需要实现OTSessionDelegate协议。 在StreamingViewController.swift的底部添加以下扩展名:

// MARK: - OTSessionDelegate
extension StreamingViewController: OTSessionDelegate {
  // 1
  func sessionDidConnect(_ session: OTSession) {
    print("The client connected to the session.")
  }

  // 2
  func sessionDidDisconnect(_ session: OTSession) {
    print("The client disconnected from the session.")
  }

  // 3
  func session(_ session: OTSession, didFailWithError error: OTError) {
    print("The client failed to connect to the session: \(error).")
  }

  // 4
  func session(_ session: OTSession, streamCreated stream: OTStream) {
    print("A stream was created in the session.")
  }

  // 5
  func session(_ session: OTSession, streamDestroyed stream: OTStream) {
    print("A stream was destroyed in the session.")
  }
}

此代码处理与会话有关的事件。 具体而言,在:

您几乎可以尝试使用您的应用了,但是您仍然需要实际连接到该会话。

为此,请在viewDidLoad()的底部添加以下内容:

connectToSession()

构建并运行,然后进入休息室。 屏幕仍然是黑色的,但是您会在控制台中注意到已成功连接到会话:


Publishing the Camera

现在您可以连接到该会话了,该发布相机和麦克风了。

connectToSession()下面添加以下内容:

private func publishCamera() {
  // 1
  guard let publisher = OTPublisher(delegate: nil) else {
    return
  }

  // 2
  var error: OTError?
  session?.publish(publisher, error: &error)

  // 3
  if let error = error {
    print("An error occurred when trying to publish", error)
    return
  }

  // 4
  guard let publisherView = publisher.view else {
    return
  }

  // 5
  let screenBounds = UIScreen.main.bounds
  let viewWidth: CGFloat = 150
  let viewHeight: CGFloat = 267
  let margin: CGFloat = 20

  publisherView.frame = CGRect(
    x: screenBounds.width - viewWidth - margin,
    y: screenBounds.height - viewHeight - margin,
    width: viewWidth,
    height: viewHeight
  )
  view.addSubview(publisherView)
}

这是此代码的作用:

注意:您可以在此处将OTPublisher的委托设置为nil,但是您可以实现OTPublisherDelegate来处理与发布者有关的事件,例如异步错误。您也可以使用它将设置传递到OTPublisher,以调整摄像机分辨率,音频后备设置,视频缩放行为等。

接下来,要在建立连接后在sessionDidConnect(_ :)内发布摄像机,请在print后添加以下内容:

publishCamera()

构建并运行,您将在右下角看到模拟器的默认茶壶旋转视频。 多么贴切! 您现在正在该会话中进行直播。 如果您要在设备上运行此代码,则会看到相机的视频。 恭喜,您现在有半场茶话会!


Subscribing to an Incoming Stream

您需要先订阅它,然后才能看到来自发布该会话的其他客户端的视频流。

token属性下添加以下内容:

private var subscriberView: UIView?

这将对保存其他客户端视频流的视图保持强引用。

现在,在publishCamera()下面添加以下代码:

private func subscribe(to stream: OTStream) {
  // 1
  guard let subscriber = OTSubscriber(stream: stream, delegate: nil) else {
    return
  }

  // 2
  var error: OTError?
  session?.subscribe(subscriber, error: &error)

  // 3
  if let error = error {
    print("An error occurred when subscribing to the stream", error)
    return
  }

  // 4
  guard let subscriberView = subscriber.view else {
    return
  }

  // 5
  self.subscriberView = subscriberView
  subscriberView.frame = UIScreen.main.bounds
  view.insertSubview(subscriberView, at: 0)
}

这是这段代码中发生的事情:

注意:您还可以在此处将OTSubscriber的委托设置为nil。 实现OTSubscriberDelegate协议使您能够处理与订户有关的事件。

最后,在session(_:streamCreated:)的底部,添加:

subscribe(to: stream)

这样一来,无论何时创建流,您都可以订阅。

要在您的应用中提供双向直播,您需要与其他设备或另一个iOS模拟器的朋友。 在这种情况下,请使用iPhone 12 Pro模拟器进行构建和运行。 然后,停止运行该应用程序,选择iPhone 12模拟器并重新构建并运行。

现在,在iPhone 12 Pro模拟器上,点击TeaParty app再次将其打开,您将有两个模拟器同时运行。 在两个模拟器上进入休息室,您会在每个设备上看到两个旋转的茶壶:

这两个模拟器都举行了虚拟茶话会 —— 他们都将视频发布到会话中,并订阅彼此的视频流!


Disconnecting From the Session

Leave按钮,您会发现该应用程序未调用sessionDidDisconnect()。 那是因为会话仍处于连接状态。 退出会话时,请务必断开其连接,这一点很重要。

StreamingViewController.swift中,用以下内容替换Leave()的主体:

var error: OTError?
session?.disconnect(&error)

if let error = error {
  print("An error occurred disconnecting from the session", error)
} else {
  navigationController?.popViewController(animated: true)
}

这将使您与会话断开连接,当您单击Leave按钮时,会话会自动取消发布流。 如果断开连接时没有发生同步错误,则它将从导航堆栈中弹出当前视图控制器。

session(_:streamDestroyed :)内部,在底部添加以下代码:

subscriberView?.removeFromSuperview()

当订阅者停止在会话中发布其流时,这将从屏幕上删除订阅者的视图。

现在,构建并运行并仔细检查离开和进入休息室的工作是否如您所愿。

就这样,您现在已经拥有一个功能齐全的应用程序,可以将其安装到真实的设备上,以便您可以与朋友进行虚拟茶话会!

在本教程中,您学到了很多有关如何创建直播事件的知识。您必须了解WebRTC,HLSRTMP等重要术语,设置Vonage Video API帐户,并使用Vonage Video API构建了双向双向视频流应用程序。

但是,该项目只是简化了Vonage Video API功能的表面。还有很多东西要学习,包括:

如果您想了解有关Vonage Video API功能的更多信息,请查看其 developer guides

另外,请确保您在我们的Video Streaming Tutorial for iOS中阅读了使用Apple框架的iOS视频流。

后记

本篇主要讲述了基于Vonage Video的应用中添加一个实时视频流的简单实现,感兴趣的给个赞或者关注~~~

上一篇 下一篇

猜你喜欢

热点阅读