來源:GitHubDaily前端
Hi!你們好呀!我是大家可愛的喵哥!git
自 2015 年的千播大戰至今,社交直播已經衍生出不少不一樣的玩法了。傳統的簡單 「你說我聽」,已經再基礎不過,又很難給觀衆帶來 「刺激」 的形式了。你要是看過如今的直播,什麼多人連麥、主播 PK、虛擬主播,玩法愈來愈多。現現在,若是能瞭解怎麼開發其中一個直播場景,絕對能給本身的簡歷加分。github
但問題是,實時音視頻技術背後有很是多的坑,很難有一我的能從後端到前端自研出來一套直播系統。而經過調用不一樣的 API 來搭建是最佳的實踐途徑。swift
最近在 GitHub 上就有這樣一個新的開源項目,它實現了單主播直播、多人連麥直播、PK 直播、虛擬主播,四種如今社交直播領域最成熟的場景。後端
Github URL:https://github.com/AgoraIO-usecase/agoralive微信
這個項目本來是聲網 Agora 開發的「Agora Live」,是做爲一個 Demo 提供給用戶來體驗不一樣互動直播場景而開發的。近期這個應用不只升級了,從新設計了 UI,並且開源了出來。app
你們徹底能夠參考這個應用作個本身的社交直播應用。(他們每月都給每一個開發者提供 10000 分鐘免費用量)。async
單主播直播場景:這是 Agora Live 最初就支持的功能,支持美顏、文字消息、添加背景音樂等功能。編輯器
多人連麥直播場景:在直播的基礎上,還可邀請另外 6 名觀衆進行連麥。svg
PK 直播場景:就像你們在陌陌、抖音等應用中看到的 PK 直播同樣,主播能夠向另外一個主播發起 PK 邀請。兩個直播間的觀衆會同時看到兩個主播在線互動。
虛擬主播場景:與單主播直播場景相似,只不過 App 會爲主播生成一個實時的虛擬形象,虛擬形象的表情會與主播同步。在直播過程當中,還能夠邀請觀衆上麥。
這個示例中,直播間、房主與觀衆連麥,都是基於聲網 Agora Native 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() } } }
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) } } }
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] 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 中的源碼,在聲網官網註冊一個帳號,在後臺獲取 AppID 後,替換掉源碼中的 AppID 就能夠了。
官方表示還將在接下來幾個月對 repo 中的代碼進一步梳理、優化,提高源碼的易用性、可讀性。並且,將來還會增長新的場景。
不管是想體驗一下社交直播應用開發,仍是想基於此作個本身的直播應用的童鞋,均可以去試試:
GitHub 地址:
https://github.com/AgoraIO-usecase/agoralive
往期精彩內容:
...
關注Github喵,回覆「進階」,
領取喵哥推薦的技術進階知識大禮包!!!
本文分享自微信公衆號 - Github喵(gh_acfcf1689379)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。