StreamVideo iOS
这是 StreamVideo 的官方 iOS SDK,StreamVideo 是一个用于构建具有视频和音频通话支持的移动应用程序的平台。仓库包括一个底层 SDK 和一组可重用的 UI 组件,支持 UIKit 和 SwiftUI。
什么是 Stream?
Stream 允许开发者快速部署可伸缩的流、聊天消息和视频,并提供业界领先的 99.999% 高可用性 SLA 保证。
使用 Stream 的视频组件,您可以使用其 SDK 构建应用内视频通话、音频房间、音频通话或现场直播。最佳入门方式是查看他们的教程。
- 视频 & 音频通话教程
- 音频房间教程
- 现场直播教程
Stream 提供了 UI 组件和状态处理,这些组件使构建应用程序的视频通话变得容易。所有通话都在 Stream 全球边缘服务器网络上运行,确保最佳延迟和可靠性。
👩💻 免费提供给制作者 👨💻
对于大多数侧面和兴趣项目,流是免费的。要想符合资格,您的项目/公司需要拥有 < 5 个团队成员和 < 的月收入 $10k。制作者每月免费获得 $100 的视频 Credit。
💡支持的功能💡
以下是我们支持的一些功能:
- 开发者体验:优秀的 SDK、文档、教程和支持,让您快速构建
- 边缘网络:全球服务器确保最佳延迟和可靠性
- 聊天:存储聊天记录、反应、线程、输入指示器、URL 预览等
- 安全与隐私:基于美国和欧盟,拥有 Soc2 认证,符合 GDPR
- 动态缩放:自动切换分辨率、帧率、比特率、编解码器以及在大型调用中翻页视频
- 屏幕共享
- 画中画支持
- 活跃说话者
- 自定义事件
- 地理围栏
- 通知和来电铃声
- Opus DTX & Red 确保可靠的音频
- Webhooks & SQS
- 后台模式
- 灵活的权限系统
- 通过 ID、链接或邀请加入通话
- 在通话中启用和禁用音频和视频
- 翻转、启用和禁用通话中的摄像头
- 在通话中启用和禁用免提电话
- 推送通知提供商支持
- 通话录制
- 广播到 HLS
仓库概览 😎
此仓库包含以下部分:
- 用于调用的低级客户端(如果您想构建自己的 UI,则可以独立使用)
- SwiftUI SDK(使用 SwiftUI 开发的 UI 组件)
- UIKit SDK(在 UIKit 应用中更容易使用的包装器)
主要原则
- 逐步揭露:可以对SDK进行容易使用,并无需深入理解即可使用。随着你对SDK越来越熟悉,可以深入挖掘并开始在整个级别的自定义。
- Swift本地API:利用Swift强大的语言特性使SDK的使用简单且类型安全。
- 熟悉的行为:UI元素是优秀平台公民,并像本地元素一样行为;它们尊重
tintColor
、填充、浅色/深色模式、动态字体大小等。 - 完全开源实现:您可以在GitHub上访问SDK的完整源代码。
底层客户端
底层客户端用于建立音频和视频通话。它与Stream的后端基础设施集成,并实现了WebRTC协议。
以下是底层客户端提供的最重要组件
StreamVideo
- 主SDK对象。Call
- 一个提供有关通话状态的信息的对象,以及更新它的方法。
StreamVideo
这是与底层客户端交互的主要对象。在使用SDK之前,需要使用API密钥和用户/令牌进行初始化。
let streamVideo = StreamVideo(
apiKey: "key1",
user: user.userInfo,
token: user.token,
videoConfig: VideoConfig(),
tokenProvider: { result in
yourNetworkService.loadToken(completion: result)
}
)
Call
Call
类提供了关于呼叫的所有信息,比如参与者、是否正在录音等。它还提供了在通话中进行标准操作的方法,例如静音/取消静音用户、发送反应、更改相机输入、授权权限、录音等。
您可以通过 StreamVideo
的方法 func call(callType: String, callId: String, members: [Member])
创建一个新的 Call
。
SwiftUI SDK
SwiftUI SDK 提供了即用的 UI 组件,可以直接用于您的应用。
向您的托管视图添加调用支持的最简单方法是附加 CallModifier
。
struct CallView: View {
@StateObject var viewModel: CallViewModel
init() {
_viewModel = StateObject(wrappedValue: CallViewModel())
}
var body: some View {
HomeView(viewModel: viewModel)
.modifier(CallModifier(viewModel: viewModel))
}
}
通过在我们的 ViewFactory
中实现相应的的方法,您可以自定义展示在调用流程中的屏幕的外观和感觉。
我们的组件大多是公开的,因此如果您想构建自定义 UI,可以将它们作为构建块使用。
SDK 中使用的所有文本、图像、字体和声音都可以通过我们的 Appearance
类进行配置,以帮助您将视图与托管应用的品牌保持一致。
UIKit SDK
UIKit SDK 提供了围绕 SwiftUI 视图的 UIKit 包装器。其主要集成点是 CallViewController
,您可以轻松地将其推入导航堆栈中,或作为模态屏幕添加。
private func didTapStartButton() {
let next = CallViewController.make(with: callViewModel)
next.modalPresentationStyle = .fullScreen
next.startCall(
callType: "default",
callId: callId,
members: members
)
self.navigationController?.present(next, animated: true)
}
CallViewController
是与一个 CallViewModel
一起创建的——这就是我们在 SwiftUI SDK 中使用的同一个。
目前,UIKit SDK 中所有自定义都需要在 SwiftUI 中完成。
路线图
视频路线图和更改日志请在此处获取:链接。
0.2 版本里程碑
- Toast 视图
- 测试覆盖率
- 大堂更新(显示参与者和活动)
- 支持设置.audio.default_device
- 在所有 API 调用中报告 SDK 版本号
- 修复 AppClips
- 查询渠道的分页
0.3 版本里程碑
- 用户远程锁定
- 将聊天添加到 AppStore 应用(如果可能,还包括应用剪贴版)
- 稳定性
- API 集成测试
- CPU 使用率改进
- 音频房间 UIKit 指南
- 改进聊天集成
- 从手机进行屏幕共享
- 切换免提/耳机按钮
- 音频过滤器
0.4 版本里程碑
- 模拟 ICE 重启和 SFU 切换的按钮
- 画中画示例(如果获得权限的话)
- Dynascale 2.0(编解码器,f 分辨率切换,WebRTC 处理分辨率)
- 与许多参与者测试
- 视频 UIKit 指南
- 呼叫分析 / 统计
- 改进日志记录 / Sentry 集成
- 完成重新连接流程
- 分析集成
- 查询成员的分页
- 轻触聚焦
- 以最高分辨率显示的视频流图片
- 处理测试反馈
- 改进实时流指南(取决于 RTMP 支持情况)