1. 程式人生 > >iOS開發 搭建視訊直播系統,基於LFLiveKit+ijkplayer+rtmp(iOS端)

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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。