標籤:架構 rip 過程 pre 疑問 之一 弊端 object 沒有
最近由於需求的變動,項目內把最初最簡單的原生直播架構變成了B站開源的ijkplayer架構,下面把具體的過程總結一下整個過程都比較簡單,重要的是理解的過程,整合完畢之後,視頻的使用者體驗比蘋果原生好了很多。最後會貼出demo的git地址,只需要簡單的操作就能快速的在項目中加入該架構
先把B站開源ijkplayer的github地址貼出來 https://github.com/Bilibili/ijkplayer
未使用過的同學,請去自取有助於理解整個視頻架構的原理。
** 為何要改變原來項目內的ApsaraVideo for Live,錄播架構?**
首先我先說一下為何我們項目內會修改原來原生的直播與視頻架構,這個過程能體現出來ijkplayer對比iOS原生的各種優點。
1.我們最初使用的原聲直播是使用MPMoviePlayerController,該類蘋果官方有提示讓使用AVPlayerViewController來替代,雖然MPMoviePlayerController就目前來看還可以正常使用,但是可能在未來不久的時間就會出現問題。
2.對比直播:直播的第一指標是延遲問題,蘋果原生的直播協議僅支援hls協議,而ijkplayer不僅支援hls,也支援rtmp協議,hsl協議的弊端就是讓人頭疼的延遲問題,該協議會把視頻切成一段一段的m3u8的視頻片段,延遲一般來說會到10秒左右,而rtmp協議延遲非常小,從修改完之後的情況來說,視頻的流暢度提高了非常多。這條原因,是修改直播架構的根本原因之一。
3.對比錄播流:如果同時播放雲端儲存的視頻流,它存在著一些不可迴避的問題,那就是支援的視頻編碼格式很有限:H.264、MPEG-4,副檔名(壓縮格式):.mp4、.mov、.m4v、.m2v、.3gp、.3g2等。這種支援對於運營的操作要求很高,支援的格式比較少。而ijkplayer不僅包括了原生可以支援的所有格式,主流的視頻格式基本可以全部支援。
4.對比使用者互動:MPMoviePlayerController自訂樣式和使用者互動的一些手勢操作非常有限,而ijkplayer你幾乎可以定製一切你可以想到的互動,主流的直播app都在使用。
對比以上幾條原因,我們在項目中進行了進一步的升級,使用ijkplayer的需求非常迫切。
** 主要代碼相關**
具體demo會在下方貼出連結,這裡僅示範最重要的幾步要求。
1.下載完畢demo後,由於ijk的framework包比較大所以沒有跟著項目一起上傳,需要先將github地址詳情內的ijk的framework的zip包下載下來,匯入項目,並且將路徑配置好。
其實打出來ijk的framework包的這個過程是一個非常好的理解過程,由於有很多打包流程,這裡貼出來一個比較詳細的供大家參考
點這裡,這個過程比較詳細
2.匯入中的幾個檔案
Paste_Image.png
3.項目內初始化關鍵代碼,寫入即可運行
// 建立盛放視頻播放器的父視圖 用於改變全屏和縮小 _headPlayerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.width*videoTempProgress)]; [self.view addSubview:_headPlayerView]; //測試地址 //rtmp 直播 香港電視台測試地址 rtmp://live.hkstv.hk.lxdns.com/live/hks //錄播 播放流http://hc.yinyuetai.com/uploads/videos/common/E49E014999C93F5A88EA01B2B48161CE.flv?sc=fc5276d37b6cd89c&br=775&vid=2178416&aid=2650&area=Other&vst=3 //該模型可以隨意設定 來傳入你想自訂的內容 XYVideoModel *model = [[XYVideoModel alloc]init]; model.url = [NSURL URLWithString:@"http://hc.yinyuetai.com/uploads/videos/common/E49E014999C93F5A88EA01B2B48161CE.flv?sc=fc5276d37b6cd89c&br=775&vid=2178416&aid=2650&area=Other&vst=3"]; model.name = @"測試標題測試標題測試標題"; model.coverimg = @"coverimg.jpeg"; // 建立視頻播放控制項 self.playerView = [[LMVideoPlayerView alloc]initWithModel:model]; //遵循LMVideoPlayerViewDelegate 來實現退出全屏 和 放大的代理 self.playerView.delegate = self; [_headPlayerView addSubview:self.playerView];
#pragma mark XYVideoPlayerViewDelegate//全屏按鈕代理方法- (void)fullScreenWithPlayerView:(LMVideoPlayerView *)videoPlayerView{//點擊放大旋轉和返回縮小的方法 if (self.playerView.isRotate) { [UIView animateWithDuration:0.3 animations:^{ _headPlayerView.transform = CGAffineTransformRotate(_headPlayerView.transform, M_PI_2); _headPlayerView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height); self.playerView.frame = _headPlayerView.bounds; }]; }else{ [UIView animateWithDuration:0.3 animations:^{ _headPlayerView.transform = CGAffineTransformIdentity; _headPlayerView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.width*videoTempProgress); self.playerView.frame = _headPlayerView.bounds; }]; }}//返回按鈕代理方法- (void)backToBeforeVC{ if (!self.playerView.isRotate) { [self.navigationController popViewControllerAnimated:YES]; }}
** github demo地址**
demo地址,歡迎star
如果有任何疑問和對ijk的理解問題,可以隨時留言或者私信溝通
死涵Leesim
連結:https://www.jianshu.com/p/3c109b2c5ba9
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
iOS 快速整合ijkplayerApsaraVideo for Live與錄播架構