七牛低延时直播接入指南
步骤一: 提供拉流域名做低延迟配置(提交工单)
步骤二: 推流端推流(不能包含 B 帧)
步骤三: 使用七牛的播放器拉流
服务 TIPS
1.低延时直播采用 RTC 相关技术,大部分浏览器原生支持 RTC 播放,适用性更强;播放延迟小于 1 秒,适用于大部分对延迟有要求的直播场景
2.推流端推流直播流中不包含 B 帧【推流命令样例:./ffmpeg -re -i “////.mp4” -c copy -c:v libx264 -bf 0 -f flv ‘rtmp://pili-publish.marsyu.site/lb-test/20200125h265test?expire=1610992020&token=W9G5v8_h5k6mgwshHQ2l7zB6NC4=’】,不符合要求的直播流可能会出现卡顿/画面撕裂等问题;若推流侧无法自行适配,可以使用我们的服务端转码功能,在播放 URL 流名称后面添加 @zerolatency
转码规格 (转码将增加 200-400ms 延时,对播放延时有极高要求的客户请适配低延时推流规格,转码将收取额外费用)
3.<低延时 Web SDK> 需要浏览器支持 RTC 和 H264 解码,目前部分 Android 手机自带浏览器并未支持 RTC,在这种情况下,我们建议更换浏览器或直接使用移动端的 SDK <低延时 iOS SDK><低延时 Android SDK>
4.低延时直播SDK仅能播放低延时直播类型的直播流,如果需要播放rtmp/flv/hls/或者mp4等视频流,请使用标准播放器进行播放
5.使用七牛的 iOS 推流 SDK,按照如下设置即可保证直播流中不包含 B 帧:
PLVideoStreamingConfiguration 的 videoProfileLevel 的设置选择 H264Baseline 类型
videoProfileLevel:AVVideoProfileLevelH264BaselineAutoLevel
QNRTPlayerKit
七牛低延时直播构建了全新的低延时直播互动体验,相比于传统的直播能力降低了延时、优化了协议与底层技术,目前对于微信内直播多业务场景提供了更为优渥的使用体验。支持千万级并发同时拥有毫秒级开播体验,打通了用户对于直播低延时性的核心诉求。
功能特性
- 支持 H.264 视频解码
- 支持 Opus 音频解码
- 支持 HeaderDoc 文档
- 支持 ARMv7, ARM64, i386, x86_64 架构
- 支持纯音频或纯视频播放
- 支持自定义音视频处理
- 支持苹果 ATS 安全标准
- 支持 WHEP 协议拉流
系统要求
- iOS Target : >= iOS 12
- iOS Device : >= iPhone 5s
安装方法
CocoaPods 是针对 Objective-C 的依赖管理工具,它能够将使用类似 QNRTPlayerKit 的第三方库的安装过程变得非常简单和自动化,你能够用下面的命令来安装它:
$ sudo gem install cocoapods
Podfile
为了使用 CoacoaPods 集成 QNRTPlayerKit 到你的 Xcode 工程当中,你需要编写你的 Podfile
source 'https://github.com/CocoaPods/Specs.git'
target 'TargetName' do
pod 'QNRTPlayerKit'
end
- 默认为真机版
- 若需要使用模拟器 + 真机版,则改用如下配置
pod "QNRTPlayerKit", :podspec => 'https://raw.githubusercontent.com/pili-engineering/QNRTPlayer-iOS/master/QNRTPlayerKit-Universal.podspec'
注意:鉴于目前 iOS 上架,只支持动态库真机,请在 App 上架前,更换至真机版本
然后,运行如下的命令:
$ pod install
反馈及意见
当你遇到任何问题时,可以通过在 GitHub 的 repo 提交 issues 来反馈问题,请尽可能的描述清楚遇到的问题,如果有错误信息也一同附带,并且在 Labels 中指明类型为 bug 或者其他。
API参考
QNRTPlayer
QNRTPlayer
为建立音视频播放的核心类,包含播放、停止,静音等接口。
属性
playState
定义
@property (nonatomic, assign, readonly) QNRTPlayState playState;
说明:播放的状态,当播放状态变更时会通过 - (void)RTPlayer:(QNRTPlayer *)player playStateDidChange:(QNRTPlayState)playState;
方法回调。
delegate
定义
@property (nonatomic, weak) id<QNRTPlayerDelegate> delegate;
说明:状态回调的 delegate。
isPlaying
定义
@property (nonatomic, assign, readonly) BOOL isPlaying;
说明:是否在播放状态
playUrl
定义
@property (nonatomic, copy, readonly) NSURL *playUrl;
说明:播放的 URL
statisticInterval
定义
@property (nonatomic, assign) NSUInteger statisticInterval;
说明:统计信息回调的时间间隔,单位为秒。默认为 0,即默认不会回调统计信息。
volume
定义
@property (nonatomic, assign) double volume;
说明:播放音量
width
定义
@property (nonatomic, assign, readonly) CGFloat width;
说明:视频的宽
height
定义
@property (nonatomic, assign, readonly) CGFloat height;
说明:视频的高
playView
定义
@property (nonatomic, strong) QNRTVideoView *playView;
说明:渲染播放画面
方法
playWithUrl:supportHttps:
定义
- (void)playWithUrl:(NSURL *)url supportHttps:(BOOL)isSupport;
参数
参数名 | 描述 |
---|---|
url | 需要播放的 url ,目前支持rtmp、hls、hdl和webrtc (url 以 webrtc:// 开头) 协议 |
isSupport | 当前播放 URL 是否支持 SSL 证书,默认为 NO |
说明:开始播放新的 url
注意: 1. 当前 iOS 系统网络限制,默认不支持 http 带域名访问,需要支持 SSL,且 isSupport 为 YES,或者开启 ATS 支持 HTTP 带域名访问,即可正常播放。 2. 播放域名需在七牛配置并完成解析,如播放失败请联系我们处理。
stop
定义
- (void)stop;
说明:停止播放
muteAudio:
定义
- (void)muteAudio:(BOOL)mute;
参数
参数名 | 描述 |
---|---|
mute | 是否需要静音 |
说明:静音
muteVideo:
定义
- (void)muteVideo:(BOOL)mute;
参数
参数名 | 描述 |
---|---|
mute | 是否需要画面渲染 |
说明:停止画面渲染
setSpeakerOn:
定义
- (void)setSpeakerOn:(BOOL)speakerOn;
参数
参数名 | 描述 |
---|---|
speakerOn | 扬声器开关 |
说明:是否将声音从扬声器输出
注意:默认值为 NO,传入 YES 时,会强制声音从扬声器输出。另外,由于系统原因,在某些设备(如 iPhone XS Max、iPhone 8 Plus)上,连接 AirPods 后无法通过该接口将声音强制设为扬声器输出。如有需求,可以通过使用 AVRoutePickerView 来切换。
takeScreenshotCallback:
定义
- (void)takeScreenshotCallback:(QNScreenshotResultCallback)resultCallback;
参数
参数名 | 描述 |
---|---|
resultCallback | 截图的结果回调 |
说明:截图播放画面
注意:成功则回调图片,失败则回调错误。拉到首帧之后才可正常截图。
setJitterBufferMinDelay:
定义
- (void)setJitterBufferMinDelay:(double)jitterBufferMinDelay;
参数
参数名 | 描述 |
---|---|
jitterBufferMinDelay | 抖动缓冲区最小延迟 |
说明:设置抖动缓冲区的最小延迟
注意:默认为 0,不开启抖动延迟,时间单位为秒,范围 [0, 1],建议不超过 600ms。
enableFileLogging
定义
+ (void)enableFileLogging;
说明:开启文件日志,建议在 App 启动时即开启,日志文件位于 App App Container/Library/Caches/Pili/RTLogs 目录下以 QNRTPlayer+当前时间命名的目录内
注意:文件日志功能主要用于排查问题,打开文件日志功能会对性能有一定影响,上线前请记得关闭文件日志功能!
versionInfo
定义
+ (NSString *)versionInfo;
说明:获取 SDK 的版本信息。
QNRTPlayerDelegate
QNRTPlayerDelegate
在 QNRTPlayer 运行过程中的状态和事件回调
方法
RTPlayer:didFailWithError:
定义
- (void)RTPlayer:(QNRTPlayer *)player didFailWithError:(NSError *)error;
参数
参数名 | 描述 |
---|---|
player | QNRTPlayer 实例 |
error | 错误内容 |
说明:运行过程中发生错误会通过该方法回调
RTPlayer:playStateDidChange:
定义
- (void)RTPlayer:(QNRTPlayer *)player playStateDidChange:(QNRTPlayState)playState;
参数
参数名 | 描述 |
---|---|
player | QNRTPlayer 实例 |
playState | playState 播放状态 |
说明:在运行过程中,状态发生变化的回调
RTPlayer:didGetStatistic:
定义
- (void)RTPlayer:(QNRTPlayer *)player didGetStatistic:(NSDictionary *)statistic;
参数
参数名 | 描述 |
---|---|
player | QNRTPlayer 实例 |
statistic | 统计信息 ,包括:音频码率,视频码率,视频帧率 |
说明:统计信息回调,回调的时间间隔由 statisticInterval 参数决定,statisticInterval 默认为 0,即不回调统计信息。
RTPlayer:trackDidReceived
定义
- (void)RTPlayer:(QNRTPlayer *)player trackDidReceived:(QNRTSourceKind )kind;
参数
参数名 | 描述 |
---|---|
player | QNRTPlayer 实例 |
kind | 数据类型 |
说明:当前流媒体流收到数据 track。
RTCEngine:firstSourceDidDecode:
定义
- (void)RTPlayer:(QNRTPlayer *)player firstSourceDidDecode:(QNRTSourceKind )kind;
参数
参数名 | 描述 |
---|---|
player | QNRTPlayer 实例 |
kind | 数据类型 |
说明:音视频首帧解码后的回调。
QNRTErrorDomain
QNRTErrorDomain
定义了播放过程中的错误信息,包括但不限于连接错误、鉴权失败等错误信息。
QNRTCErrorDomain | 错误码 | 功能 |
---|---|---|
QNRTErrorNetworkError | 20001 | 服务请求超时,或者域名解析错误等 |
QNRTErrorAuthFailed | 20002 | 请求服务鉴权失败 |
QNRTErrorPlayStreamNotExit | 20003 | 播放流地址不存在 |
QNRTErrorPlayRequestFailed | 20004 | 对应服务 invalid parameter / server error |
QNRTErrorDescriptionError | 20005 | 内部sdp错误 |
QNRTErrorConnectFailed | 20006 | 连接异常 |
QNRTErrorOperationNotAllowed | 20007 | 操作不被允许 |
QNRTPlayState
QNRTPlayState
定义了播放的状态。
QNRTPlayState | 功能 |
---|---|
QNRTPlayStateUnknow | 未知状态,只会作为 init 前的初始状态,开始播放之后任何情况下都不会再回到此状态 |
QNRTPlayStateInit | 初始状态 |
QNRTPlayStateReady | 准备播放的状态 |
QNRTPlayStatePlaying | 正在播放的状态 |
QNRTPlayStateStoped | 停止播放的状态 |
QNRTPlayStateError | 播放发生错误的状态 |
QNRTSourceKind
QNRTSourceKind
定义了 source 的类型。
QNRTSourceKind | 功能 |
---|---|
QNRTSourceKindAudio | 音频 |
QNRTSourceKindVideo | 视频 |
QNRTVideoFillModeType
QNRTVideoFillModeType
定义了视频填充模式。
QNRTVideoFillModeType | 功能 |
---|---|
QNRTVideoFillModeStretch | 拉伸以填充整个视图 |
QNRTVideoFillModePreserveAspectRatio | 画面均匀缩放的同时保持宽高比,添加指定背景色的条形 |
QNRTVideoFillModePreserveAspectRatioAndFill | 保持源图像的长宽比,放大其中心以填充视图 |
QNScreenshotResultCallback
QNScreenshotResultCallback
定义了截图的回调。
typedef void (^QNScreenshotResultCallback)(UIImage *ShotImage, NSError *error);