Vonage Video框架解析(二)—— 應用中添加一個實時視頻流的簡單實現(二) 版本記錄 前言 源碼 後記

版本記錄

版本號 時間
V1.0 2021.05.19 星期三

前言

Vonage Video框架是提供直播流服務的一個平臺,接下來這幾篇就主要對這個框架進行介紹和講解。感興趣的可以看下面幾篇文章。
1. Vonage Video框架解析(一)—— 應用中添加一個實時視頻流的簡單實現(一)

源碼

1. Swift

首先看下工程組織結構

下面就是源碼了

1. AppDelegate.swift
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate { }
2. SceneDelegate.swift
import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
  var window: UIWindow?
}
3. TeaPartyViewController.swift
import UIKit

final class TeaPartyViewController: UIViewController {
  @IBOutlet private var imageView: UIImageView!

  override func viewDidLoad() {
    super.viewDidLoad()
    // swiftlint:disable:next force_unwrapping
    let image = UIImage(named: "tea-background")!
    imageView.image = image.resizableImage(withCapInsets: .zero, resizingMode: .tile)
  }
}
4. StreamingViewController.swift
import OpenTok
import Foundation

final class StreamingViewController: UIViewController {
  private let apiKey = "your_api_key"
  private let sessionId = "your_session_id"
  // swiftlint:disable:next line_length
  private let token = "your_token"
  private var subscriberView: UIView?
  private var session: OTSession?

  @IBOutlet private var leaveButton: UIButton!

  override func viewDidLoad() {
    super.viewDidLoad()
    leaveButton.layer.cornerRadius = leaveButton.frame.size.height / 2
    navigationController?.interactivePopGestureRecognizer?.isEnabled = false
    connectToSession()
  }

  @IBAction private func 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)
    }
  }

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

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

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

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

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

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

    guard let publisherView = publisher.view else {
      return
    }

    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)
  }

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

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

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

    guard let subscriberView = subscriber.view else {
      return
    }

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

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

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

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

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

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

後記

本篇主要講述了基於Vonage Video的應用中添加一個實時視頻流的簡單實現,感興趣的給個贊或者關注~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章