
图:新版 Aogra Live(iOS)

新版 Agora Live 目前已经支持四种时下最热门的实时互动场景,包括:
单主播直播场景:这是 Agora Live 最初就支持的功能,支持美颜、文字消息、添加背景音乐等功能。

多人连麦直播场景:在直播的基础上,还可邀请另外 6 名观众进行连麦。
PK 直播场景:就像大家在陌陌、抖音等应用中看到的 PK 直播一样,主播可以向另一个主播发起 PK 邀请。两个直播间的观众会同时看到两个主播在线互动。
虚拟主播场景:与单主播直播场景类似,只不过App 会为主播生成一个实时的虚拟形象,虚拟形象的表情会与主播同步。在直播过程中,还可以邀请观众上麦。

App 中所有音视频实时互动与文字消息、控制指令(如邀请上麦),都是基于声网 Agora Native SDK 、声网 Agora 实时消息 RTM SDK 实现的。美颜、虚拟形象则是基于声网Agora 的生态合作伙伴相芯科技 FaceUnity SDK 实现的。
为了便于大家快速熟悉源码,我们简单讲解以下核心功能的代码。以下以 Swift 代码为例。
这个示例中,直播间、房主与观众连麦,都是基于 Agora RTC SDK 实现的。我们通过以下代码可以让用户加入RTC频道,实现音视频的互通。
func join(channel: String, token: String? = nil, streamId: Int, success: Completion = nil) {agoraKit.join(channel: channel, token: token, streamId: streamId) { [unowned self] inself.channelStatus = .ingif let success = success {success()}}}
func joinChannel(_ id: String, delegate: AgoraRtmChannelDelegate, success: Completion, fail: ErrorCompletion) {do {let channel = try createChannel(id: id, delegate: delegate)channel.join { (errorCode) inswitch errorCode {case .channelErrorOk:self.log(info: "rtm join channel success", extra: "channel id: \(id)")if let success = success {success()}default:let error = AGEError.rtm("join channel fail",code: errorCode.rawValue,extra: "channel: \(id)")self.log(error: error)if let fail = fail {fail(error)}}}} catch {log(error: error, extra: "create channel fail")if let fail = fail {fail(error)}}}
typedef void (^FUCompletion)(void);typedef void (^FUErrorCompletion)(NSError *error);typedef NS_ENUM(NSUInteger, FUFilterItemType) {FUFilterItemTypeSmooth = 1,FUFilterItemTypeBrighten = 2,FUFilterItemTypeThinning = 3,FUFilterItemTypeEye = 4};@interface FUFilterItem : NSObject@property (nonatomic, assign) FUFilterItemType type;@property (nonatomic, assign) float defaultValue;@property (nonatomic, assign) float minValue;@property (nonatomic, assign) float maxValue;@property (nonatomic, assign) float value;@property (nonatomic, copy) NSString *funcName;@end@interface FUClient : NSObject- (void)loadFilterWithSuccess:(FUCompletion)success fail:(FUErrorCompletion)fail;- (void)setFilterValue:(float)value withType:(FUFilterItemType)type;- (FUFilterItem *)getFilterItemWithType:(FUFilterItemType)type;- (void)loadBackgroudWithSuccess:(FUCompletion)success fail:(FUErrorCompletion)fail;- (void)loadAnimoji:(NSString *)name success:(FUCompletion)success fail:(FUErrorCompletion)fail;- (void)renderItemsToPixelBuffer:(CVPixelBufferRef)pixelBuffer;- (void)destoryAllItems;@end
func camera(_ camera: AGESingleCamera, position: AGECamera.Position, didOutput sampleBuffer: CMSampleBuffer) {cameraStreamQueue.async { [unowned self] inguard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {return}CVPixelBufferLockBaseAddress(pixelBuffer, .init(rawValue: 0))let timeStamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)if self.enhancement.beauty == .on || self.enhancement.appearance != .none {self.enhancement.renderItems(to: pixelBuffer)}self.consumer?.consumePixelBuffer(pixelBuffer,withTimestamp: timeStamp,rotation: .rotationNone)CVPixelBufferUnlockBaseAddress(pixelBuffer, .init(rawValue: 0))}}
我们已经在官方 Github「AgoraIO Usecase」中开源了 Agora Live 的代码。大家可以直接 fork,替换 AppID 即可使用。方便大家快速实现多人连麦直播、单主播直播、PK 直播、虚拟主播 4 种实时互动场景。
Github URL:https://github.com/AgoraIO-usecase/agoralive
我们还将在接下来几个月对 repo 中的代码进一步梳理、优化,提升源码的易用性、可读性。而且,还会在本季度增加新的场景。当然,如果你在这份源码基础上,自己实现了更多功能,也欢迎提交 PR。我们也会向社区中更多开发者推荐你的项目。


