一個讓我欲罷不能的 GitHub 開源項目!


來源: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


圖:新版 Aogra Live(iOS)截圖

固然了,你在蘋果 App Store 也能搜到這個應用,Android 用戶也能夠在聲網官網找到下載連接,或者本身用 GitHub 的源碼編譯一份也行,只是須要替換其中的 AppID 爲本身的。

它實現的那些熱門場景


新版 Agora Live 目前已經支持四種時下最熱門的實時互動場景,包括:
  • 單主播直播場景:這是 Agora Live 最初就支持的功能,支持美顏、文字消息、添加背景音樂等功能。編輯器

  • 多人連麥直播場景:在直播的基礎上,還可邀請另外 6 名觀衆進行連麥。svg

  • PK 直播場景:就像你們在陌陌、抖音等應用中看到的 PK 直播同樣,主播能夠向另外一個主播發起 PK 邀請。兩個直播間的觀衆會同時看到兩個主播在線互動。

  • 虛擬主播場景:與單主播直播場景相似,只不過 App 會爲主播生成一個實時的虛擬形象,虛擬形象的表情會與主播同步。在直播過程當中,還能夠邀請觀衆上麥。


App 中全部音視頻實時互動與文字消息、控制指令(如邀請上麥),都是基於聲網 Agora Native SDK 、聲網 Agora 實時消息 RTM SDK 實現的。
核心功能的實現


下面以 Swift 代碼爲例。

這個示例中,直播間、房主與觀衆連麥,都是基於聲網 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() } } }
在直播間中的 文字消息、控制指令 (好比邀請觀衆上麥)等,都是基於 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 中的源碼,在聲網官網註冊一個帳號,在後臺獲取 AppID 後,替換掉源碼中的 AppID 就能夠了。

官方表示還將在接下來幾個月對 repo 中的代碼進一步梳理、優化,提高源碼的易用性、可讀性。並且,將來還會增長新的場景。

不管是想體驗一下社交直播應用開發,仍是想基於此作個本身的直播應用的童鞋,均可以去試試:

GitHub 地址:

https://github.com/AgoraIO-usecase/agoralive

往期精彩內容

一我的居然擼了一個網易雲音樂雲村

一款 Github 代碼泄漏監控軟件

...


關注Github喵,回覆「進階」,

領取喵哥推薦的技術進階知識大禮包!!!

本文分享自微信公衆號 - Github喵(gh_acfcf1689379)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索