iOS開發 搭建視訊直播系統,基於LFLiveKit+ijkplayer+rtmp(iOS端)
本文主要使用的三個技術:
- 推流:LFLiveKit
- 播放:ijkplayer
- 伺服器:nginx+rtmp+ffmpeg
有了這三點技術就可以完成一個簡約的直播系統。效果圖如下(右邊的是用模擬器裝置執行播放的,中間的是用VLC播放器播放的,當前在用手機推流直播)。
效果圖.gif
一、推流
LFLiveKit:框架支援RTMP,由Adobe公司開發。github地址https://github.com/LaiFengiOS/LFLiveKit
LFLiveKit庫裡已經整合GPUImage框架用於美顏功能,GPUImage基於OpenGl開發,純OC語言框架,封裝好了各種濾鏡同時也可以編寫自定義的濾鏡,其本身內建了多達125種常見的濾鏡效果。
1.將專案下載到本地。
2.根據README.md檔案整合,如下截圖:
screen1.png
終端cd 到LFLiveKitDemo後,再輸入vim Podfile後,檔案直接自動補全如下
source 'https://github.com/CocoaPods/Specs.git'
platform :ios,'7.0'
target “LFLiveKitDemo” do
pod 'LFLiveKit', :path => '../.'
end
注意:須將“LFLiveKitDemo”的中文引號改為英文引號。同時刪掉, :path => '../.'
3.執行LFLiveKitDemo。
1)會有如下報錯程式碼,將其註釋
videoConfiguration.outputImageOrientation = UIInterfaceOrientationLandscapeLeft;
videoConfiguration.autorotate = NO;
2)再次執行程式碼會有報錯,修改後如下
_videoCamera.outputImageOrientation = statusBar; // if (statusBar != UIInterfaceOrientationPortrait && statusBar != UIInterfaceOrientationPortraitUpsideDown) { // @throw [NSException exceptionWithName:@"當前設定方向出錯" reason:@"LFLiveVideoConfiguration landscape error" userInfo:nil]; // } else { // }
3)再次執行便可成功推流。
4.百度裡下載支援rtmp協議的視訊播放器VLC,以確保我的直播已被推到伺服器。
開啟VLC,然後點選工具欄File - Open Network... ,然後輸入的URL是LFLivePreview.m檔案裡stream.url值如下:
LFLiveStreamInfo *stream = [LFLiveStreamInfo new];
stream.url = @"rtmp://live.hkstv.hk.lxdns.com:1935/live/stream153";
[_self.session startLive:stream];
請注意這是LFLiveKit的公用伺服器地址,別人也可以拉流獲取看到你的直播。將在最後介紹在自己電腦中搭建自己的伺服器,再也不怕被別人偷看了。
5.將LFLiveKit整合到自己的專案
新建專案名為LXPlayerLive,將Podfile裡填寫為
source 'https://github.com/CocoaPods/Specs.git'
platform :ios,'7.0'
target "LXPlayerLive" do
pod 'LFLiveKit'
end
將LFLivePreview、UIControl+YYAdd、UIView+Add這三個類的.h與.m檔案拖入專案中,執行無誤後做如下修改
1)改為豎屏直播,配置如下圖
screen3.png
2)註釋掉ViewController.m裡的程式碼
//- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
// return UIInterfaceOrientationMaskLandscape;
//}
//
//- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
// return YES;
//}
3)修改LFLivePreview.m的對應程式碼videoSize的值為
videoConfiguration.videoSize = CGSizeMake(360, 640);
二、播放
ijkplayer:是基於FFmpeg的跨平臺播放器框架,由B站開發。目前已被多個主流直播App整合使用。github地址:https://github.com/Bilibili/ijkplayer
若不願執行源demo(配置時間較久),可以直接跳到第四步整合IJKMediaFramework庫。
1.檢視README.md,找到Build iOS,如下截圖:
screen4.png
2.根據介紹進行終端命令列操作,截圖如下:
screen5.png
繼續執行如下命令(時間稍長)
cd ios
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
3.執行IJKMediaDemo示例專案
成功後找到拉流的關鍵程式碼用於自己專案整合。在app介面上點選Online Samples,再點選任意一個cell即可播放。從而在demo中可追蹤到IJKMoviePlayerViewController類,即是播放的類。
4.在自己專案LXPlayerLive中使用IJKMediaFramework.framework庫播放
按照如上的步驟便可整合好ijkplayer,但是下載ffmpeg與編譯,執行指令碼時間太長也麻煩,所以有大神將其整合為了一個IJKMediaFramework.framework庫,直接新增即可使用,免去上面步驟中的麻煩。(下載地址忘記了,有Debug與Release版本)
1)注意:一定先把IJKMediaFramework.framework複製到專案資料夾中,別拖到專案中,然後在Build Phases -> Link Binary with Libraries -> Add這個位置新增IJKMediaFramework庫
2)根據screen4.png截圖中的提示,再新增相應的13個庫。
5.整合程式碼
例項demo中的播放介面用的mediaControl自己感覺很醜就不使用其相關程式碼了,將其餘程式碼全部複製到自己專案的播放控制器中。整合的核心程式碼如下:
[IJKFFMoviePlayerController checkIfFFmpegVersionMatch:YES];
// [IJKFFMoviePlayerController checkIfPlayerVersionMatch:YES major:1 minor:0 micro:0];
IJKFFOptions *options = [IJKFFOptions optionsByDefault];
self.player = [[IJKFFMoviePlayerController alloc] initWithContentURL:self.url withOptions:options];
self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
self.player.view.frame = self.view.bounds;
self.player.scalingMode = IJKMPMovieScalingModeAspectFit;
self.player.shouldAutoplay = YES;
self.view.autoresizesSubviews = YES;
[self.view addSubview:self.player.view];
此處的self.url暫時還使用LFLiveKit的開發者提供的免費公用直播推流伺服器地址(在播放時常常看到別的程式設計師的直播,偷笑)。
三、伺服器搭建
nginx+rtmp+ffmpeg:在本地搭建伺服器,免去開通第三方直播的流量費用。
現在我們的專案中集成了推流的所用的LFLiveKit,播放所需的ijkplayer,便可用手機做推流直播,模擬器做拉流播放。
1.安裝Homebrew
因為安裝nginx+rtmp+ ffmpeg需要Homebrew。使用命令man brew檢視是否裝有Homebrew,若沒有自行再百度安裝即可,我的由於之前裝過ReactNative的環境需要Homebrew,因此會提示一個幫助資訊(證明已經安裝有了),然後輸入Q即可退出。
2.安裝nginx
分別鍵入如下命令
brew tap homebrew/nginx
brew install nginx-full --with-rtmp-module
nginx
brew info nginx-full
此時在終點末尾查詢nginx.conf檔案的位置,如下圖
screen6.png
然後進入進入/usr/local/etc/nginx/nginx.conf檔案裡,在最後一行新增如下程式碼
rtmp {
server {
listen 1935;
application rtmplive {
live on;
record off;
}
}
}
3.重啟nginx
nginx -v 檢視版本號後再執行
/usr/local/Cellar/nginx-full/1.10.1/bin/nginx -s reload
將上面的1.10.1換成你剛才輸出的版本號。
4.安裝ffmpeg
鍵入如下命令(時間較長)。
brew install ffmpeg
5.到此已完成nginx的伺服器搭建
可將專案中所用的推流與拉流的URL由rtmp://live.hkstv.hk.lxdns.com:1935/live/stream153換成rtmp://192.168.15.122:1935/rtmplive/room。
注意:
1.將192.168.15.122換成自己電腦的ip地址,埠號1935別改。
2.必須保證推流與拉流的裝置與此電腦使用的是同一個區域網。
四、總結
本文主要分享如何使用第三方框架的經驗,從原始碼到整合,沒作程式碼解析。一個完整的直播系統需要涉及到的技術主要包括以下方面:
1.採集、2.濾鏡處理、3.編碼、4.推流、5.CDN分發、6.拉流、7.解碼、8.播放、9.聊天互動。
其中1~4由LFLiveKit完成(2由GPUImage完成),5就是搭建的本地伺服器,6~8由ijkplayer完成。
原始碼請點選github地址下載。
抓取了映客、喵播、鬥魚等的直播介面用在了此demo上的地址是github地址。
執行LXPlayerLive原始碼會報錯,因缺少IJKMediaFramework庫,檔案太大不能上傳到Github,請另外下載IJKMediaFramework按照上面的方法新增到我的demo中。專案用了pods,所以還需執行 pod install。
再次執行如果報錯如下:
screen7.png
需設定 General>Deployment Info> Deployment Target 為8.0
作者:App開發LiXu
連結:https://www.jianshu.com/p/30595a5bff42
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。