本文詳細說明iOS端推流SDK介面、SDK的基本使用流程以及相關功能的使用樣本。
如果您需要使用移動端進行推流,詳細操作請參見推流、拉流與播流。
iOS推流SDK特性
支援RTMP推流協議。
支援基於RTC的RTS超低延時直播推拉流協議。
支援連麥互動和PK互動。
使用視頻H.264編碼以及音頻AAC編碼。
支援碼控、解析度、顯示模式等自訂配置。
支援多種網路攝影機相關操作。
支援即時美顏和自訂美顏效果調節。
支援增、刪動態貼紙實現動態浮水印效果。
支援錄屏直播。
支援自訂YUV、PCM等外部音視頻輸入。
支援多路混流功能。
支援純音視頻推流以及後台推流。
支援背景音樂及其相關操作。
可使用視訊截圖功能。
支援自動重連、異常處理。
支援音頻3A演算法。
增加視頻軟編、硬編切換邏輯,提升編碼模組穩定性。
功能限制
使用iOS推流SDK需注意以下限制:
您只能在推流之前設定橫豎屏模式,不支援在直播的過程中即時切換。
在推流設定為橫屏模式時,需設定介面為不允許自動旋轉。
在硬編模式下,考慮編碼器相容問題解析度會使用16的倍數,如設定為540P,則輸出的解析度為544*960,在設定播放器視圖大小時需按輸出解析度等比縮放,避免黑邊等問題。
推流SDK使用流程
基礎版SDK的基本使用流程如下:
步驟 | 描述 | 操作指引及程式碼範例 |
一、註冊SDK | 配置License相關參數,註冊推流SDK。若不調用註冊函數,推流功能無法使用。 | |
二、配置推流參數 | 完成推流基本配置、碼率控制配置、解析度自適應配置、美顏功能配置等。 | |
三、使用推流SDK推流 | 初始化SDK、註冊推流回調、建立預覽視圖後可以開始推流。使用者可以根據業務需求添加推流量控制、設定背景音樂、網路攝影機、直播答題、外部音頻、動態貼紙等。 說明 阿里雲ApsaraVideo for Live不允許同一時間向同一個推流URL進行多路推流(第二路推流會被拒絕)。 | |
四、設定錄屏推流(按需) | 如需使用錄屏推流,可以實現錄屏推流相關的配置。 |
互動版SDK使用流程如下:
步驟 | 描述 | 操作指引及程式碼範例 |
一、註冊SDK | 配置License相關參數,註冊推流SDK。若不調用註冊函數,推流功能無法使用。 | |
二、設定直播連麥互動 | 設定連麥互動,使用者可以使用推流SDK互動版本完成主播和連麥觀眾超低延時(300ms以內)互動。 |
註冊SDK
推流SDK升級到4.4.2及以後版本,接入一體化License服務。在使用推流功能前必須進行註冊,否則無法使用推流SDK功能。具體操作,請參見iOS端註冊SDK。
配置推流參數(基礎版)
您可以使用AlivcLivePushConfig配置推流參數,每個參數有一個對應的預設值。關於預設值和參數範圍,請參見iOS基礎版推流SDK介面說明或iOS互動版推流SDK介面說明或注釋。
如需在推流過程中即時修改參數,請參見AlivcLivePusher提供的屬性和方法。
基本推流配置。
在需要使用推流器的ViewController中引用標頭檔
#import <AlivcLivePusher/AlivcLivePusher.h>
,範例程式碼如下:AlivcLivePushConfig *config = [[AlivcLivePushConfig alloc] init];//初始化推流配置類,也可使用initWithResolution來初始化。 config.resolution = AlivcLivePushResolution540P;//預設為540P,最大支援720P config.fps = AlivcLivePushFPS20; //建議使用者使用20fps config.enableAutoBitrate = true; // 開啟碼率自適應,預設為true config.videoEncodeGop = AlivcLivePushVideoEncodeGOP_2;//預設值為2,主要畫面格間隔越大,延時越高。建議設定為1-2。 config.connectRetryInterval = 2000; // 單位為毫秒,重連時間長度2s,重連間隔設定不小於1秒,建議使用預設值即可。 config.previewMirror = false; // 預設為false,正常情況下都選擇false即可。 config.orientation = AlivcLivePushOrientationPortrait; // 預設為豎屏,可設定home鍵向左或向右橫屏。
說明綜合手機效能和網路頻寬要求,建議您將解析度設定為540P(主流移動直播App基本都採用540P)。
基本推流配置對應參數都有預設值,建議採用預設值,即您可以進行簡單初始化,不做配置。
關閉自適應碼率後,碼率將固定在初始碼率,不會在設定的目標碼率和最小碼率之間自適應調整。如果網路情況不穩定,可能造成播放卡頓,請慎用。
配置碼率控制。
推流SDK提供以下碼率控制模式,請根據實際需求修改參數值。
碼率控制模式
描述
範例程式碼
AlivcLivePushQualityModeResolutionFirst
清晰度優先模式。SDK內部會對碼率參數進行配置,優先保障推流視頻的清晰度。
config.qualityMode = AlivcLivePushQualityModeResolutionFirst;//預設為清晰度優先模式,可設定為流暢度優先模式和自訂模式。
AlivcLivePushQualityModeFluencyFirst
流暢度優先模式。SDK內部會對碼率參數進行配置,優先保障推流視頻的流暢度。
config.qualityMode = AlivcLivePushQualityModeFluencyFirst;//預設為流暢度優先模式,可設定為清晰度優先模式和自訂模式。
AlivcLivePushQualityModeCustom
自訂模式。SDK會根據開發人員設定的碼率進行配置。設定為自訂模式時,需要自己定義初始碼率、最小碼率和目標碼率。
初始碼率:開始直播時的碼率。
最小碼率:當網路較差時,碼率會逐步減低到最小碼率,以減少視頻的卡頓。
目標碼率:當網路較好時,碼率會逐步提高到目標碼率,以提高視頻清晰度。
config.qualityMode = AlivcLivePushQualityModeCustom//設定為自訂模式 config.targetVideoBitrate = 1400; //目標碼率1400kbps config.minVideoBitrate = 600; //最小碼率600kbps config.initialVideoBitrate = 1000; //初始碼率1000kbps
說明選擇清晰度優先或流暢度優先模式時,不需設定初始碼率、最小碼率和目標碼率(initialVideoBitrate、minVideoBitrate、targetVideoBitrate)。推流SDK內部策略會自動保障在網路抖動情況下優先考慮視頻清晰度或流暢度。
選擇自訂碼率時,請參考阿里雲推薦設定配置對應碼率。推薦設定請參考下表內容。
表 1. 自訂碼率控制推薦設定(畫質優先) 解析度
初始碼率 initialVideoBitrate
最小碼率 minVideoBitrate
目標碼率 targetVideoBitrate
360P
600
300
1000
480P
800
300
1200
540P
1000
600
1400
720P
1500
600
2000
1080P
1800
1200
2500
表 2. 自訂碼率控制推薦設定(流暢度優先) 解析度
初始碼率 initialVideoBitrate
最小碼率 minVideoBitrate
目標碼率 targetVideoBitrate
360P
400
200
600
480P
600
300
800
540P
800
300
1000
720P
1000
300
1200
1080P
1500
1200
2200
配置解析度自適應。
開啟動態調整推流解析度功能後,當網路較差時會自動降低解析度以提高視頻的流暢度和清晰度。範例程式碼如下:
config.enableAutoResolution = YES; // 開啟解析度自適應,預設為NO
重要某些播放器可能不支援動態解析度,如果您需要使用解析度自適應功能,建議使用阿里雲播放器。
解析度自適應只有在清晰度優先或流暢度優先時才會生效(AlivcQualityModeEnum參數配置),自訂模式時無效。
配置美顏功能。
阿里雲推流SDK提供兩種美顏模式:基礎美顏和進階美顏。基礎美顏支援美白、磨皮和紅潤。進階美顏支援基於臉部辨識的美白、磨皮、紅潤、大眼、小臉、瘦臉等功能。此功能由美顏特效SDK簡介提供,使用範例程式碼如下:
#pragma mark - "美顏類型和美顏參數API"/** * @brief 開啟或者關閉某個美顏類型 * @param type QueenBeautyType 類型的一個值 * @param isOpen YES: 開啟,NO:關閉 * */ - (void)setQueenBeautyType:(kQueenBeautyType)type enable:(BOOL)isOpen; /** * @brief 設定美顏參數 * @param param 美顏參數類型,QueenBeautyParams中的一個 * @param value 需要設定的數值,值的範圍都是[0,1],小於0的置0,大於1的置1 */ - (void)setQueenBeautyParams:(kQueenBeautyParams)param value:(float)value; #pragma mark - "濾鏡相關API" /** * @brief 設定濾鏡圖片,設定濾鏡圖片前需要將kQueenBeautyTypeLUT開啟 * @param imagePath 所要設定的濾鏡圖片的地址 */ - (void)setLutImagePath:(NSString *)imagePath; #pragma mark - "美型相關API" /** *@brief 設定美型類型,設定前需要將kQueenBeautyTypeFaceShape開啟 *@param faceShapeType 需要設定美型的類型,參考QueenBeautyFaceShapeType *@param value 需要設定的值 */ - (void)setFaceShape:(kQueenBeautyFaceShapeType)faceShapeType value:(float)value; #pragma mark - "美妝相關api" /** * @brief 設定美妝類型和圖片素材路徑,設定美妝需要將kQueenBeautyTypeMakeup開啟 * @param makeupType 美妝類型 * @param imagePaths 美妝素材地址集合 * @param blend 混合類型 */ - (void)setMakeupWithType:(kQueenBeautyMakeupType)makeupType paths:(NSArray<NSString *> *)imagePaths blendType:(kQueenBeautyBlend)blend; /** * @brief 設定美妝類型和圖片素材路徑 * @param makeupType 美妝類型 * @param imagePaths 美妝素材地址集合 * @param blend 混合類型 * @param fps 對應的幀率 */ - (void)setMakeupWithType:(kQueenBeautyMakeupType)makeupType paths:(NSArray<NSString *> *)imagePaths blendType:(kQueenBeautyBlend)blend fps:(int)fps; /** * @brief 設定美妝透明度,可指定性別 * @param makeupType 美妝類型 * @param isFeMale 是否是女性,女性:YES,男性:NO * @param alpha 妝容透明度 */ - (void)setMakeupAlphaWithType:(kQueenBeautyMakeupType)makeupType female:(BOOL)isFeMale alpha:(float)alpha; /** * @brief 設定美妝類型的混合類型 * @param makeupType 美妝類型 * @param blend 混合類型 */ - (void)setMakeupBlendWithType:(kQueenBeautyMakeupType)makeupType blendType:(kQueenBeautyBlend)blend; /** * @brief 清除所有美妝 */ - (void)resetAllMakeupType;
配置圖片推流。
為了更好的使用者體驗,SDK提供了後台圖片推流和碼率過低時進行圖片推流的設定。當SDK退至後台時預設暫停推流視頻,只推流音頻,此時可以設定圖片來進行圖片推流和音頻推流。例如,在圖片上提醒使用者主播離開片刻,稍後回來。範例程式碼如下:
config.pauseImg = [UIImage imageNamed:@"圖片.png"];//設定使用者後台推流的圖片
另外,當網路較差時您可以根據自己的需求設定推流一張靜態圖片。設定圖片後,SDK檢測到當前碼率較低時,會推流此圖片,避免視頻流卡頓。範例程式碼如下:
config.networkPoorImg = [UIImage imageNamed:@"圖片.png"];//設定網路較差時推流
配置浮水印。
推流SDK提供了添加浮水印功能,並且最多支援添加多個浮水印,浮水印圖片必須為PNG格式圖片。範例程式碼如下:
NSString *watermarkBundlePath = [[NSBundle mainBundle] pathForResource: [NSString stringWithFormat:@"watermark"] ofType:@"png"];//設定浮水印圖片路徑 [config addWatermarkWithPath: watermarkBundlePath watermarkCoordX:0.1 watermarkCoordY:0.1 watermarkWidth:0.3];//添加浮水印
說明coordX、coordY、width為相對值,例如watermarkCoordX:0.1表示浮水印的x值為推流畫面x軸的10%位置,如果推流解析度為540*960,則浮水印x值為54。
浮水印圖片的高度,按照浮水印圖片的真實寬高與輸入的width值等比縮放。
要實現文字浮水印,可以先將文字轉換為圖片,再使用此介面添加浮水印。
為了保障浮水印顯示的清晰度與邊緣平滑,請您盡量使用和浮水印輸出尺寸相同大小的浮水印源圖片。如輸出視頻解析度544*940,浮水印顯示的w是0.1f,則盡量使用浮水印源圖片寬度在544*0.1f=54.4左右。
配置預覽顯示模式。
推流SDK支援三種預覽模式,預覽顯示模式不影響推流。
ALIVC_LIVE_PUSHER_PREVIEW_SCALE_FILL :預覽顯示時,鋪滿視窗。當視頻比例和視窗比例不一致時,預覽會有變形。
ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT:預覽顯示時,保持視頻比例。當視頻比例與視窗比例不一致時,預覽會有黑邊。(預設)
ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FILL:預覽顯示時,剪下視頻以適配視窗比例。當視頻比例和視窗比例不一致時,預覽會裁剪視頻。
範例程式碼如下:
mAlivcLivePushConfig.setPreviewDisplayMode(AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT);
說明三種模式可以在AlivcLivePushConfig中設定,也可以在預覽中和推流中通過API setpreviewDisplayMode進行動態設定。
本設定只對預覽顯示生效,實際推出的視頻流的解析度和AlivcLivePushConfig中預設定的解析度一致,並不會因為更改預覽顯示模式而變化。預覽顯示模式是為了適配不同尺寸的手機,您可以自由選擇預覽效果。
使用推流SDK推流(基礎版)
AlivcLivePusher為推流SDK的核心類,提供網路攝影機預覽、推流回調、推流量控制、推流過程中的參數調節等功能。通過下文操作步驟,您可以瞭解如何使用推流核心介面。
初始化。
在配置好推流參數後,可以使用推流SDK的initWithConfig方法進行初始化。範例程式碼如下:
self.livePusher = [[AlivcLivePusher alloc] initWithConfig:config];
說明AlivcLivePusher目前不支援多執行個體,所以一個init必須對應有一個destory。
註冊推流回調。
推流回調分為三種:
Info:主要做提示和狀態檢測使用。
Error:錯誤回調。
Network:主要為網路相關。
註冊delegate可接收對應的回調。範例程式碼如下:
[self.livePusher setInfoDelegate:self]; [self.livePusher setErrorDelegate:self]; [self.livePusher setNetworkDelegate:self];
開始預覽。
livePusher對象初始化完成之後,可以進行開始預覽操作。預覽時需要傳入網路攝影機預覽的顯示view(繼承自UIView)。範例程式碼如下:
[self.livePusher startPreview:self.view];
開始推流。
預覽成功後才可以開始推流,因此需監聽AlivcLivePusherInfoDelegate的onPreviewStarted回調,在回調裡面添加如下代碼。
[self.livePusher startPushWithURL:@"推流測試地址(rtmp://......)"];
說明推流SDK同時提供了非同步方法呼叫,可調用startPushWithURLAsync來實現。
推流SDK支援RTMP格式和RTS格式的推流地址,且RTS推流相對於RTMP推流穩定性和抗弱網有顯著提升,建議使用者優先使用RTS推流。RTMP和RTS推流效果對比及RTS推流方法,請參見推流SDK進行RTS推流指南。
使用正確的推流地址開始推流後,可用播放器(阿里雲播放器、FFplay、VLC等)進行拉流測試,拉流地址擷取請參見產生推流地址和播放地址。
SDK內部已經做好退後台相關處理,無需您做操作。退入後台SDK預設繼續推流音頻,視頻保留在最後一幀。您需要在App的Capabilities中開啟Background Mode選項,選中Audio,AirPlay and Picture in Picture。保證App退後台可以正常採集音頻。詳情請參見退後台和電話中。
設定其他推流量控制。
推流量控制主要包括開始推流、停止推流、停止預覽、重新推流、暫停網路攝影機推流、恢複推流、銷毀推流等操作,使用者可以根據業務需求添加按鈕進行操作。範例程式碼如下:
/*使用者可以設定pauseImage後調用pause介面,從網路攝影機推流切換成靜態圖片推流,音頻推流繼續。*/ [self.livePusher pause]; /*從靜態圖片推流切換成網路攝影機推流,音頻推流繼續。*/ [self.livePusher resume]; /*推流狀態下可調用停止推流,完成後推流停止。*/ [self.livePusher stopPush]; /*在預覽狀態下才可以調用停止預覽,正在推流狀態下,調用停止預覽無效。預覽停止後,預覽畫面定格在最後一幀。*/ [self.livePusher stopPreview]; /*推流狀態下或者接收到所有Error相關回調狀態下可調用重新推流,且Error狀態下只可以調用此介面(或者reconnectPushAsync重連)或者調用destory銷毀推流。完成後重新開始推流,重啟ALivcLivePusher內部的一切資源,包括預覽、推流等等restart。*/ [self.livePusher restartPush]; /*推流狀態下或者接收到AlivcLivePusherNetworkDelegate相關的Error回調狀態下可調用此介面, 且Error狀態下只可以調用此介面(或者restartPush重新推流)或者調用destory銷毀推流。完成後推流重連,重新連結推流RTMP。*/ [self.livePusher reconnectPushAsync]; /*銷毀推流後,推流停止,預覽停止,預覽畫面移除。AlivcLivePusher相關的一切資源銷毀。*/ [self.livePusher destory]; self.livePusher = nil; /*擷取推流狀態。*/ AlivcLivePushStatus status = [self.livePusher getLiveStatus];
美顏即時調整。
推流SDK支援在推流時即時調整美顏參數,開啟美顏開關,分別調整對應的參數值,此功能由智能美化特效提供,範例程式碼如下:
[_queenEngine setQueenBeautyType:kQueenBeautyTypeSkinBuffing enable:YES]; [_queenEngine setQueenBeautyType:kQueenBeautyTypeSkinWhiting enable:YES]; [_queenEngine setQueenBeautyParams:kQueenBeautyParamsWhitening value:0.8f]; [_queenEngine setQueenBeautyParams:kQueenBeautyParamsSharpen value:0.6f]; [_queenEngine setQueenBeautyParams:kQueenBeautyParamsSkinBuffing value:0.6];
設定背景音樂。
推流SDK提供了背景音樂播放、混音、降噪、耳返、靜音等功能,背景音樂相關介面在開始預覽之後才可調用。範例程式碼如下:
/*開始播放背景音樂。*/ [self.livePusher startBGMWithMusicPathAsync:musicPath]; /*停止播放背景音樂。若當前現正播放BGM,並且需要切換歌曲,只需要調用開始播放背景音樂介面即可,無需停止當前現正播放的背景音樂。*/ [self.livePusher stopBGMAsync]; /*暫停播放背景音樂,背景音樂開始播放後才可調用此介面。*/ [self.livePusher pauseBGM]; /*恢複播放背景音樂,背景音樂暫停狀態下才可調用此介面。*/ [self.livePusher resumeBGM]; /*開啟迴圈播放音樂*/ [self.livePusher setBGMLoop:true]; /*設定降噪開關。開啟降噪後,將對採集到的聲音中非人聲的部分進行過濾處理。可能存在對人聲稍微抑製作用,建議讓使用者自由選擇是否開啟降噪功能,預設不使用*/ [self.livePusher setAudioDenoise:true]; /*設定耳返開關。耳返功能主要應用於KTV情境。開啟耳返後,插入耳機將在耳機中聽到主播說話聲音。關閉後,插入耳機無法聽到人聲。未插入耳機的情況下,耳返不起作用。*/ [self.livePusher setBGMEarsBack:true]; /*混音設定,提供背景音樂和人聲採集音量調整。*/ [self.livePusher setBGMVolume:50];//設定背景音樂音量 [self.livePusher setCaptureVolume:50];//設定人聲採集音量 /*設定靜音。靜音後音樂聲音和人聲輸入都會靜音。要單獨設定音樂或人聲靜音可以通過混音音量設定介面來調整。*/ [self.livePusher setMute:isMute?true:false];
設定推流截圖。
推流SDK提供了本地視頻流截圖功能,範例程式碼如下:
/*設定截圖回調*/ [self.livePushersetSnapshotDelegate:self]; /*調用截圖API*/ [self.livePushersnapshot:1interval:1];
網路攝影機相關操作。
您只能在開始預覽之後調用網路攝影機相關操作,包括推流狀態、暫停狀態、重連狀態等,可操作網路攝影機切換、閃關燈、焦距、變焦和鏡像設定等。未開始預覽狀態下調用如下介面無效。範例程式碼如下:
/*切換前後網路攝影機*/ [self.livePusher switchCamera]; /*開啟/關閉閃光燈,在自拍時開啟閃關燈無效*/ [self.livePusher setFlash:false]; /*焦距調整,即可實現採集畫面的縮放功能。傳入參數為正數,則放大焦距,傳入參數為負數則縮小焦距。*/ CGFloat max = [_livePusher getMaxZoom]; [self.livePusher setZoom:MIN(1.0, max)]; /*手動對焦。手動聚焦需要傳入兩個參數:1.point 對焦的點(需要對焦的點的座標);2.autoFocus 是否需要自動對焦,該參數僅對調用介面的該次對焦操作生效。後續是否自動對 焦沿用上述自動聚焦介面設定值。*/ [self.livePusher focusCameraAtAdjustedPoint:CGPointMake(50, 50) autoFocus:true]; /*設定是否自動對焦*/ [self.livePusher setAutoFocus:false]; /*鏡像設定。鏡像相關介面有兩個,PushMirror推流鏡像和PreviewMirror預覽鏡像。PushMirror設定僅對播放畫面生效,PreviewMirror僅對預覽畫面生效,兩者互不影響。*/ [self.livePusher setPushMirror:false]; [self.livePusher setPreviewMirror:false];
配置直播答題功能。
直播答題功能可以通過在直播流裡面插入SEI資訊,播放器解析SEI來實現。在推流SDK裡面提供了插入SEI的介面,在推流狀態下,才能調用此介面。範例程式碼如下:
/* msg: 需要插入流的SEI訊息體,建議是JSON格式。阿里雲播放器SDK可收到此SEI訊息,解析後做具體展示。 repeatCount:發送的幀數。為了保證SEI不被丟幀,需設定重複次數,如設定100,則在接下去的100幀均插入此SEI訊息。播放器會對相同的SEI進行去重處理。 delayTime:延時多少毫秒發送。 KeyFrameOnly:是否只發主要畫面格。 */ [self.livePusher sendMessage:@"題目資訊" repeatCount:100 delayTime:0 KeyFrameOnly:false];
配置外部音視頻輸入。
推流SDK支援將外部的音視頻源輸入進行推流,比如推送一個音視頻檔案。
在推流配置裡面進行外部音視頻輸入配置。
範例程式碼如下:
config.externMainStream = true;//開啟允許外部流輸入 config.externVideoFormat = AlivcLivePushVideoFormatYUVNV21;//設定視頻資料顏色格式定義,這裡設定為YUVNV21,可根據需求設定為其他格式。 config.externAudioFormat = AlivcLivePushAudioFormatS16;//設定音頻資料位元深度格式,這裡設定為S16,可根據需求設定為其他格式
插入外部視頻資料。
範例程式碼如下:
/*只支援外部視頻yuv和rbg格式的連續buffer資料,才可以通過sendVideoData介面,發送視頻資料buffer、長度、寬高、時間戳記、旋轉角度*/ [self.livePusher sendVideoData:yuvData width:720 height:1280 size:dataSize pts:nowTime rotation:0]; /*如果外部視頻資料是CMSampleBufferRef格式,可以使用sendVideoSampleBuffer介面*/ [self.livePusher sendVideoSampleBuffer:sampleBuffer] /*也可以將 CMSampleBufferRef格式轉化為連續buffer後再傳遞給sendVideoData介面, 以下為轉換的參考代碼*/ //擷取samplebuffer長度 - (int) getVideoSampleBufferSize:(CMSampleBufferRef)sampleBuffer { if(!sampleBuffer) { return 0; } int size = 0; CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); CVPixelBufferLockBaseAddress(pixelBuffer, 0); if(CVPixelBufferIsPlanar(pixelBuffer)) { int count = (int)CVPixelBufferGetPlaneCount(pixelBuffer); for(int i=0; i<count; i++) { int height = (int)CVPixelBufferGetHeightOfPlane(pixelBuffer,i); int stride = (int)CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer,i); size += stride*height; } }else { int height = (int)CVPixelBufferGetHeight(pixelBuffer); int stride = (int)CVPixelBufferGetBytesPerRow(pixelBuffer); size += stride*height; } CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); return size; } //將samplebuffer轉化為連續buffer - (int) convertVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer toNativeBuffer:(void*)nativeBuffer { if(!sampleBuffer || !nativeBuffer) { return -1; } CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); CVPixelBufferLockBaseAddress(pixelBuffer, 0); int size = 0; if(CVPixelBufferIsPlanar(pixelBuffer)) { int count = (int)CVPixelBufferGetPlaneCount(pixelBuffer); for(int i=0; i<count; i++) { int height = (int)CVPixelBufferGetHeightOfPlane(pixelBuffer,i); int stride = (int)CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer,i); void *buffer = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, i); int8_t *dstPos = (int8_t*)nativeBuffer + size; memcpy(dstPos, buffer, stride*height); size += stride*height; } }else { int height = (int)CVPixelBufferGetHeight(pixelBuffer); int stride = (int)CVPixelBufferGetBytesPerRow(pixelBuffer); void *buffer = CVPixelBufferGetBaseAddress(pixelBuffer); size += stride*height; memcpy(nativeBuffer, buffer, size); } CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); return 0; }
插入音頻資料。
範例程式碼如下:
/*只支援外部pcm格式的連續buffer資料,sendPCMData,發送音頻資料buffer、長度、時間戳記*/ [self.livePusher sendPCMData:pcmData size:size pts:nowTime];
動態貼紙。
推流SDK實現了在直播流中添加動態貼紙效果,使用此功能可實現動態浮水印效果。
動態貼紙的製作可參考Demo提供的素材進行簡單修改。自己製作動圖貼紙的序列幀圖片,並開啟config.json檔案自訂以下參數:
"du": 2.04,//播放一遍動畫持續的時間 "n": "qizi",//動圖的名稱,製作動圖時檔案夾以動圖名稱命名,每一張圖片以動圖名稱+序號命名,比如qizi0 "c": 68.0,//動畫幀數,即一個完整動畫的圖片數量 "kerneframe": 51,//主要畫面格,即指定哪一張圖片為主要畫面格,比如demo中指定第51幀為主要畫面格(需確保51幀是存在的) "frameArry": [ {"time":0,"pic":0}, {"time":0.03,"pic":1}, {"time":0.06,"pic":2}, ], //動畫參數,上述參數即表示第0秒顯示第一幀(qizi0),第0.03秒顯示第二幀(qizi1)...以此規則填寫所有幀的動畫
說明其他欄位可以直接使用demo提供的config.json檔案中的內容,無需修改。
添加動態貼紙。
範例程式碼如下:
/** * 添加動態貼紙 * @param path 貼紙檔案路徑,必須含config.json * @param x 顯示起始x位置(0~1.0f) * @param y 顯示起始y位置(0~1.0f) * @param w 顯示寬度(0~1.0f) * @param h 顯示高度(0~1.0f) * @return id 貼紙id,刪除貼紙時需設定id */ [self.livePusher addDynamicWaterMarkImageDataWithPath: "貼紙路徑" x:0.2f y:0.2f w:0.2f h:0.2f];
刪除動態貼紙。
範例程式碼如下:
[self.livePusher removeDynamicWaterMark:id];
調試工具。
SDK提供UI調試工具DebugView。DebugView為可移動的全域懸浮窗,添加後始終懸浮在視圖的最上層。內含推流日誌查看、推流績效參數即時檢測、推流主要效能折線圖表等debug功能。
說明在您的release版本下,請勿調用添加DebugView的介面。
範例程式碼如下:
[AlivcLivePusher showDebugView];//開啟調試工具
其他介面的使用。
/*在自訂模式下,使用者可以即時調整最小碼率和目標碼率。*/ [self.livePusher setTargetVideoBitrate:800]; [self.livePusher setMinVideoBitrate:200] /*擷取是否正在推流的狀態*/ BOOL isPushing = [self.livePusher isPushing]; /*擷取推流地址*/ NSString *pushURLString = [self.livePusher getPushURL]; /*擷取推流效能調試資訊。推流績效參數具體參數和描述參考API文檔或者介面注釋。*/ AlivcLivePushStatsInfo *info = [self.livePusher getLivePushStatusInfo]; /*擷取版本號碼。*/ NSString *sdkVersion = [self.livePusher getSDKVersion]; /*設定log層級,根據需求過濾想要的調試資訊*/ [self.livePusher setLogLevel:(AlivcLivePushLogLevelDebug)];
設定錄屏推流(基礎版)
ReplayKit是iOS 9引入的支援螢幕錄製功能。iOS 10在ReplayKit中新增了調用第三方App擴充來直播螢幕內容的功能。在iOS 10及以上系統中,使用推流SDK配合Extension錄屏進程,可以實現錄屏直播。
iOS為了保證系統運行流暢,給Extension錄屏進程的資源相對較少,Extension錄屏進程記憶體佔用過大會被系統強殺退出。為瞭解決Extension錄屏進程記憶體限制,推流SDK將錄屏推流分成Extension錄屏進程(Extension App)和主App進程(Host App)。Extension錄屏進程負責抓取螢幕內容,並通過處理序間通訊將螢幕內容發送給主App進程。主App進程建立推流引擎AlivcLivePusher,並將螢幕資料推送到遠端。由於在主App進程中完成整個推流過程,因此麥克風的採集和發送可以放到主App進程中進行,Extension錄屏進程只負責螢幕內容採集。
推流SDK Demo是通過App Group實現Extension錄屏進程和主App進程之間的進程通訊,並將該部分邏輯封裝在了AlivcLibReplayKitExt.framework
中。
iOS上實現螢幕推流,Extension錄屏進程由系統在錄屏需要的時候建立,並負責接收系統採集到螢幕映像。需要如下對接操作步驟:
建立App Group。
需登入 Apple Developer,完成以下操作:
在Certificates, IDs & Profiles 頁面中註冊App Group,具體操作步驟可以參考註冊App Group。
回到Identifier頁面,選擇App IDs,然後單擊您的App ID(主App進程與Extension錄屏進程的 App ID需要進行同樣的配置)啟用App Group功能。具體操作步驟可以參考啟用App Group。
完成後重新下載對應的Provisioning Profile並配置到XCode中。
操作正確完成後Extension錄屏進程可以和主App進程之間進行進程通訊。
說明建立App Group完成後需儲存App Group Identifier值,作為後續步驟的輸入內容。
建立Extension錄屏進程。
iOS推流SDK Demo中實現了支援錄屏直播的App擴充AlivcLiveBroadcast和AlivcLiveBroadcastSetupUI。App中具體建立Extension錄屏進程如下:
在現有工程選擇 ,選擇Broadcast Upload Extension,如下圖:
修改Product Name,勾選Include UI Extension,單擊Finish建立直播擴充和直播UI,如下圖:
配置直播擴充Info.plist,在新建立的Target中,Xcode會預設建立名為SampleHandler的標頭檔和源檔案,如下圖:
將
AlivcLibReplayKitExt.framework
拖到工程中,使得Extension Target依賴它。替換SampleHandler.m中的代碼成如下代碼(需將代碼中的KAPP Group替換成上文第一步驟建立的App Group Identifier)。範例程式碼如下:#import "SampleHandler.h" #import <AlivcLibReplayKitExt/AlivcLibReplayKitExt.h> @implementation SampleHandler - (void)broadcastStartedWithSetupInfo:(NSDictionary<NSString *,NSObject *> *)setupInfo { //User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional. [[AlivcReplayKitExt sharedInstance] setAppGroup:kAPPGROUP]; } - (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType { if (sampleBufferType != RPSampleBufferTypeAudioMic) { //聲音由主App進程採集發送 [[AlivcReplayKitExt sharedInstance] sendSampleBuffer:sampleBuffer withType:sampleBufferType]; } } - (void)broadcastFinished { [[AlivcReplayKitExt sharedInstance] finishBroadcast]; } @end
在您的工程中,完成建立Broadcast Upload Extension的Target,在該Extension Target中整合為錄屏擴充模組定製的
AlivcLibReplayKitExt.framework
。在錄屏推流主App進程中整合直播SDK。
在錄屏推流主App進程中建立AlivcLivePushConfig、AlivcLivePusher對象,設定外置推流ExternMainStream為True, AudioFromExternal為False(該配置表示音頻仍通過SDK內部採集),調用StartScreenCapture開始接受Extension App螢幕資料,開始和結束推流。具體可參考以下操作步驟:
錄屏推流主App進程中加入AlivcLivePusher.framework、AlivcLibRtmp.framework、RtsSDK.framework和AlivcLibReplayKitExt.framework的依賴。
初始化推流SDK,配置使用外部視頻源。
ExternMainStream設定為True, ExternVideoFormat設定為AlivcLivePushVideoFormatYUV420P,音頻使用內部SDK採集AudioFromExternal設定為False,配置其他推流參數,請參見範例程式碼如下:
self.pushConfig.externMainStream = true; self.pushConfig.externVideoFormat = AlivcLivePushVideoFormatYUV420P; self.pushConfig.audioSampleRate = 44100; self.pushConfig.audioChannel = 2; self.pushConfig.audioFromExternal = false; self.pushConfig.videoEncoderMode = AlivcLivePushVideoEncoderModeSoft; self.pushConfig.qualityMode = AlivcLivePushQualityModeCustom; self.pushConfig.targetVideoBitrate = 2500; self.pushConfig.minVideoBitrate = 2000; self.pushConfig.initialVideoBitrate = 2000; self.livePusher = [[AlivcLivePusher alloc] initWithConfig:self.pushConfig];
使用AlivcLivePusher來完成直播相關功能,調用如下函數:
開始接受錄屏資料。
需將代碼中的
kAPPGroup
替換成上文建立的App Group Identifier
,範例程式碼如下:[self.livePusher startScreenCapture:kAPPGROUP];
開始推流。
範例程式碼如下:
[self.livePusher startPushWithURL:self.pushUrl]
結束推流。
範例程式碼如下:
[self.livePusher stopPush]; [self.livePusher destory]; self.livePusher = nil;
設定直播連麥互動(互動版)
直播推流SDK互動版V4.4.4及以上版本提供基於RTC的連麥互動能力,V4.4.5及以上版本提供基於RTC的連麥PK互動能力,使用者可以使用推流SDK互動版本完成主播和連麥觀眾超低延時(300ms以內)互動,直播連麥相關的功能使用,請參見連麥互動開發指南和主播PK互動開發指南。
注意事項
關於包大小:整合SDK後,IPA包增加大小約為3MB。
適配機型。
iPhone7及以上版本,iOS8.0及以上版本。