通过直播源代码快速实现多人连麦直播、PK直播等热门场景
为了便于大家快速熟悉源码,我们简单讲解以下核心功能的代码。以下以 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] in
self.channelStatus = .ing
if let success = success {
success()
}
}
}
复制代码
在直播间中的文字消息、控制指令(比如邀请观众上麦)等,都是基于 Agora 实时消息 RTM SDK 实现的。在这里我们集成 RTM SDK 后,通过以下代码让用户加入 RTM 频道。
func joinChannel(_ id: String, delegate: AgoraRtmChannelDelegate, success: Completion, fail: ErrorCompletion) {
do {
let channel = try createChannel(id: id, delegate: delegate)
channel.join { (errorCode) in
switch 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)
}
}
}
复制代码
美颜与虚拟形象是通过接入 FaceUnity 的服务来实现的。可以结合 FUClient 这个类的实现与 FaceUnity 的文档来集成美颜模块。
直播源代码
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
复制代码
直播源代码
视频流从 AVCaptureSession 流出,流入 FaceUnity 进行前处理,然后进入 Agora RTC SDK 发送到远端。
func camera(_ camera: AGESingleCamera, position: AGECamera.Position, didOutput sampleBuffer: CMSampleBuffer) {
cameraStreamQueue.async { [unowned self] in
guard 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,替换掉源码中的 AppID 即可使用。方便大家快速实现多人连麦直播、单主播直播、PK 直播、虚拟主播 4 种实时互动场景。
直播源代码
Github URL:github.com/AgoraIO-use…
如果你在这份源码基础上,自己实现了更多功能,也欢迎提交 PR。我们也会向社区中更多开发者推荐你的项目。
补充说明
本次开源是基于现有 App,只提供了 Java 和 Swift 源码。如果大家需要 Objective-C 或 Kotlin 版本,还请自行封装。
本文转载自网络,感谢(声网Agora)的分享,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理