本文模仿映客直播,簡單實現了直播功能.
demo地址:https://github.com/sunqishuang/LikeFayerLiveAPP
直播的第三方有很多.如果公司有錢,可以買現成的服務.本文使用的都是免費的第三方框架.
直播的理論傳輸過程:采集,處理,編碼,封包,推流,傳輸,轉碼,分發,拉流,解碼,播放.
我們通過攝像頭采集數據.經過處理,然后將處理的數據推送到服務器.當一個用戶在打開主播的直播時,用戶端就是去請求這個服務器,獲取到服務器中的數據,然后展示播放.
主播端給服務器的傳輸協議:RTMP
服務器給觀眾端的傳輸協議:RTMP或者HLS
RTMP:基于TCP的長鏈接,每個時刻的數據,收到后立即轉發,延時1-3秒
HLS:基于HTTP的短鏈接,集合一段時間數據,生成1秒的切片文件,更新m3u8,延遲大于10秒
所里拉流端如果使用RMTP傳輸協議,一段就沒法緩存的.使用HLS協議是可以緩存的(服務器對結束的主播數據,進行切片處理,同時可以保存).
說了那么多廢話,我就來直接說大家關心的兩個點:拉流,推流.
1.拉流
拉流說白了就是客戶端要做的.嗶哩嗶哩為我們提供了免費的視頻直播框架:基于FFMPEG的IJKPlayer.(如果你不想用,可得自己花時間研究ffmpeg)
集成IJKPlayer:http://www.lxweimin.com/p/1f06b27b3ac0 (這位大神寫得很詳細了,我就不重復了)
在要播放的位置,初始化IJKPlayer就好:
#pragma mark ---------------------------------------------- 初始化配置Player
- (void)configPlayer{
IJKFFOptions *options = [IJKFFOptions optionsByDefault];
self.player = [[IJKFFMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:_liveModel.stream_addr] withOptions:options];
self.player.view.frame = self.view.bounds;
self.player.shouldAutoplay = YES;
[self.view addSubview:self.player.view];
}
只要在初始化的時候,直接傳入拉流地址,就可以直接播放了.
在viewwillappear中
//準備播放
[self.player prepareToPlay];
在viewWillDisappear
//結束播放
[self.player shutdown];
2.推流
推流就是主播端上傳采集的數據.集成LFLiveKit就行.
直接用cocoapods集成就好 :pod 'LFLiveKit'
先去github中下載一個LFLiveKit的demo.
找到里面的LFLivePreview類,直接是采集數據的View,在需要的控制器空,添加上一個view,就行了.當然里面的推流地址要更改.