Brytecam 是一个 SDK,用于使用 Brytecam 服务构建支持视频会议的 iOS 应用。
要求
- iOS 10.0+
- Xcode 11+
- Swift 5.1+
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。有关使用和安装说明,请访问他们的网站。要使用 CocoaPods 将 Brytecam SDK 集成到您的 Xcode 项目中,请在您的 Podfile
中指定它
pod 'Brytecam', '~> 0.2.0'
入门
检查 Example 文件夹中的示例应用以快速入门。本指南为您提供了使用 Brytecam 视频 SDK 构建应用程序时将在 Live Interactive Video API 中使用的关键对象的概述。
概念
- 房间 - 表示实时音频、数据、视频和/或屏幕共享会话,Brytecam Video SDK的基本构建模块。
- 轨道 - 表示共享到房间的实时音频、视频和数据媒体流。
- '):">'):"> peer - 表示连接到房间的所有参与者(除本地参与者外)。
- 发布 - 本地参与者可以通过将轨道"发布"到房间来共享其音频、视频和数据轨道。
- 订阅 - 本地参与者可以通过"订阅"任何同伴的轨道来流式传输任何同伴的音频、视频和数据轨道。
- 广播 - 本地参与者可以向房间中的所有同伴发送任何消息/数据。
导入模块和实例化Brytecam客户端
import Brytecam
let peer = BRTPeer(name: userName)
let room = BRTRoom(roomId: roomName)
let config = BRTClientConfig()
config.authToken = "INSERT TOKEN HERE"
let client = BRTClient(peer: peer, config: config)
设置处理器
添加处理器函数以监听同伴加入、传输打开(建立与服务器的连接)、同伴发布他们的流等。
client.onStreamAdd = { (room, peer, streamInfo) in
// A peer has published a stream. To subscibe to it we make a `subscribe` call
DispatchQueue.main.async {
client.subscribe(streamInfo, completion: { [weak self] (stream, error) in
// Query the stream for tracks and create a view to render the video track
})
}
}
client.onStreamRemove = { [weak self] (room, streamInfo) in
DispatchQueue.main.async {
// Stream got unpublished remove corresponding video view
}
}
加入房间
client.connect { (status, error) in
// handle error if any
client.join(room, completion: {(success, error) in
// this is a good place to publish local audio/video stream
})
}
发布本地流
请注意
iOS要求应用程序在系统询问相机或麦克风权限时提供静态消息以显示给用户。
如果您的应用程序使用设备摄像头,请在您的应用程序的Info.plist文件中包含NSCameraUsageDescription键。
如果您的应用程序使用设备麦克风,请在您的应用程序的Info.plist文件中包含NSMicrophoneUsageDescription键。
对于每个键,提供一条信息,解释为什么您的应用程序需要捕捉媒体,这样用户就能自信地授予您的应用程序权限。
重要
如果您的应用程序在请求授权或尝试使用捕捉设备时,在Info.plist文件中没有出现适当的键,则系统将终止您的应用程序。
以默认选项发布音频和视频流
let options = BRTPublishOptions()
options.shouldPublishAudio = true
options.shouldPublishVideo = true
// Additionaly you can configure video resolution and codec
client.publish(options, completion: { [weak self] (stream, error) in
guard let stream = stream else { return }
// get a video capturer for the stream
self?.videoCapturer = stream.videoCapturer
// save a reference to local tracks for later
self?.localAudioTrack = stream.audioTracks?.first
self?.localVideoTrack = stream.videoTracks?.first
DispatchQueue.main.async {
// initiate video capture
self?.videoCapturer?.startCapture()
}
})
渲染视频轨道
let videoView = BRTVideoView()
videoView.setVideoTrack(track)
// Add the view to the hierachy as usual