目前為止直播還是比較熱點(diǎn)的技術(shù)的,簡書,git上有幾篇閱讀量和含金量都不錯(cuò)的文章,但是別人的終究是別人的,有些時(shí)候哪怕是照著寫一遍,也會(huì)有自己的進(jìn)步,特別是你根據(jù)自己的想法和思路,在學(xué)習(xí)代碼的基礎(chǔ)上以自己的方式創(chuàng)建它,會(huì)發(fā)現(xiàn)很多東西看著是了解了但是和自己真正的動(dòng)手去實(shí)現(xiàn)它又是一回事,感慨頗深,所以有了這篇簡書。項(xiàng)目是基于ijkplayer這里先放上項(xiàng)目開源代碼MyShow(需要自行導(dǎo)入ijk),喜歡的給個(gè)星哦。

包括依賴庫,第三方,和一些工具,主要代碼分為三類,其中Live主要是直播的內(nèi)容,PushStrem主要是推流的代碼。
直播過程中的心得
直播中,利用的接口為網(wǎng)上提供的接口,把數(shù)據(jù)展示到tableview上后,顯示效果見展示頁面圖,包括觀看人數(shù),主播名稱地址,主播頭像,主播大圖等,內(nèi)容從后臺(tái)返回的數(shù)據(jù)決定。點(diǎn)擊cell,傳入相應(yīng)的圖片,進(jìn)行轉(zhuǎn)場,如下圖。
感覺整個(gè)轉(zhuǎn)場,以及播放過程中出現(xiàn)卡頓或者斷網(wǎng),的這個(gè)刷新效果是整個(gè)體驗(yàn)的是否良好的重要因素,因此這里希望大家在做的時(shí)候仔細(xì)看一下是怎么實(shí)現(xiàn)的,以及對(duì)刷新的封裝,雖然都是比較常見的,但是卻直觀的影響了我們的視覺體驗(yàn)。其實(shí)是一個(gè)GIF播放的方法。找了一份網(wǎng)上的方法還是挺好用的。
// 顯示GIF加載動(dòng)畫- (void)showGifLoding:(NSArray*)images inView:(UIView*)view{if(!images.count) {? ? ? ? images = @[[UIImageimageNamed:@"hold1_60x72"], [UIImageimageNamed:@"hold2_60x72"], [UIImageimageNamed:@"hold3_60x72"]];? ? }UIImageView*gifView = [[UIImageViewalloc] init];if(!view) {? ? ? ? view =self.view;? ? }? ? [view addSubview:gifView];? ? [gifView mas_makeConstraints:^(MASConstraintMaker *make) {? ? ? ? make.center.equalTo(@0);? ? ? ? make.width.equalTo(@60);? ? ? ? make.height.equalTo(@70);? ? }];self.gifView= gifView;? ? [gifView playGifAnim:images];}// 取消GIF加載動(dòng)畫- (void)hideGufLoding{? ? [self.gifViewstopGifAnim];self.gifView=nil;}
直播中網(wǎng)絡(luò)的實(shí)時(shí)提醒,網(wǎng)絡(luò)的改變可能會(huì)對(duì)直播的效果造成較大的影響,因此對(duì)網(wǎng)絡(luò)變化的監(jiān)測是必要的。或者使用別的方法實(shí)現(xiàn)也可以。
// 1.獲得網(wǎng)絡(luò)監(jiān)控的管理者AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];// 2.設(shè)置網(wǎng)絡(luò)狀態(tài)改變后的處理[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {// 當(dāng)網(wǎng)絡(luò)狀態(tài)改變了, 就會(huì)調(diào)用這個(gè)blockswitch(status) {caseAFNetworkReachabilityStatusUnknown:// 未知網(wǎng)絡(luò){? ? ? ? ? ? ? ? [MBProgressHUD showSuccess:@"未知網(wǎng)絡(luò)"];break;? ? ? ? ? ? }caseAFNetworkReachabilityStatusNotReachable:// 沒有網(wǎng)絡(luò)(斷網(wǎng)){? ? ? ? ? ? ? ? [MBProgressHUD showSuccess:@"無網(wǎng)絡(luò)連接"];break;? ? ? ? ? ? }caseAFNetworkReachabilityStatusReachableViaWWAN:// 手機(jī)自帶網(wǎng)絡(luò){? ? ? ? ? ? ? ? [MBProgressHUD showSuccess:@"4G/3G流量狀態(tài)"];break;? ? ? ? ? ? }caseAFNetworkReachabilityStatusReachableViaWiFi:// WIFI{? ? ? ? ? ? ? ? [MBProgressHUD showSuccess:@"當(dāng)前為WIFI環(huán)境"];break;? ? ? ? ? ? }? ? ? ? }? ? }];// 3.開始監(jiān)控[manager startMonitoring];
彈幕
彈幕實(shí)質(zhì)是多個(gè)精靈的時(shí)間上的渲染方式. PC/Web上已經(jīng)有很成熟的解決方案了; Android上比較有名的是BiliBili開源的DanmakuFlameMaster,今天我們用的輪子叫做,BarrageRenderer,省去了自己做彈幕的難度,節(jié)約了時(shí)間。
_renderer = [[BarrageRendereralloc]init];
設(shè)置之后我們對(duì)彈幕的數(shù)量和生產(chǎn)的方法進(jìn)行設(shè)置,這里用的是開源的plist文件,因此彈幕也是plist文件中讀取的內(nèi)容,在實(shí)際的項(xiàng)目中,我們可以根據(jù)后臺(tái)返回的數(shù)據(jù)去進(jìn)行解析,同樣我們可以輸入彈幕來展示。
- (void)autoSendBarrage{NSIntegerspriteNumber = [_renderer spritesNumberWithName:nil];if(spriteNumber <=50) {// 限制屏幕上的彈幕量[_renderer receive:[selfwalkTextSpriteDescriptorWithDirection:BarrageWalkDirectionR2L]];? ? }}#pragma mark - 彈幕描述符生產(chǎn)方法long_index =0;/// 生成精靈描述 - 過場文字彈幕- (BarrageDescriptor *)walkTextSpriteDescriptorWithDirection:(NSInteger)direction{? ? BarrageDescriptor * descriptor = [[BarrageDescriptor alloc]init];? ? descriptor.spriteName=NSStringFromClass([BarrageWalkTextSprite class]);? ? descriptor.params[@"text"] =self.danMuText[arc4random_uniform((uint32_t)self.danMuText.count)];? ? descriptor.params[@"textColor"] = Color(arc4random_uniform(256), arc4random_uniform(256), arc4random_uniform(256));? ? descriptor.params[@"speed"] = @(100* (double)random()/RAND_MAX+50);? ? descriptor.params[@"direction"] = @(direction);? ? descriptor.params[@"clickAction"] = ^{UIAlertView*alertView = [[UIAlertViewalloc]initWithTitle:@"提示"message:@"彈幕被點(diǎn)擊"delegate:nilcancelButtonTitle:@"取消"otherButtonTitles:nil];? ? ? ? [alertView show];? ? };returndescriptor;}- (NSArray*)danMuText{return[NSArrayarrayWithContentsOfFile:[[NSBundlemainBundle] pathForResource:@"danmu.plist"ofType:nil]];}
推流端的實(shí)現(xiàn)
推流端的實(shí)現(xiàn)是直播中不可缺少的,相對(duì)于自己實(shí)現(xiàn)一個(gè)推流,比較簡單的方式還是利用已知的框架,這里我們使用的是優(yōu)酷的開源框架LFLiveKit,使我們的開發(fā)更加簡便。
我們可以自己在電腦端搭建一個(gè)服務(wù)器來進(jìn)行測試,具體方法放兩個(gè)傳送門,我也是從這里學(xué)習(xí)的感謝開源,快速集成iOS基于RTMP的視頻推流,HLS-搭建Nginx流媒體服務(wù)器
參照以上教程,我們成功的實(shí)現(xiàn)了推流的目的。
文/夜3033(簡書作者)
原文鏈接:http://www.itdecent.cn/p/7b69d41f3495
著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡書作者”。
轉(zhuǎn)載文/夜3033(簡書作者)
原文鏈接:http://www.itdecent.cn/p/7b69d41f3495