iOS開發 整合ijkplayer實現直播#拉流#播放

奮鬥吧灬青年發表於2018-08-22

前言
  ijkplayer框架是專門用來做 視訊直播 的開源框架,基於ffmpeg,同時支援 AndroidiOS 平臺。
  對於 App 中的直播功能,如果我們成功整合ijkplayer ,那麼就算完成一半的工程了。接下來,只要獲取到 拉流 URL,就能實現視訊直播功能了。
  但是初次整合這個框架,對於新手還是有一定難度的。
  本篇主要介紹如何快速整合 ijkplayer 框架。

最終效果.gif

一、下載 ijkplayer

1、下載 ijkplayer 框架原始碼

ijkplayer下載地址


2、開啟終端,通過 git clone 進行下載

在終端中通過 git clone 下載.png

第一步: cd 進入指定的下載路徑。

cd /Users/XDLee/Desktop/Live

**第二步: **通過 git clone 命令進行下載。

git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios

下載過程比較耗時,耐心等待~~~


二、編譯 ffmpeg

1、下載完成,執行Demo,看看效果。

ijkplayer框架的目錄結構如下:

ijkplayer 框架的目錄結構.png

 


2、開啟 IJKMediaDemo,並編譯

提示: 'libavformat/avformat.h' file not found

編譯 IJKMediaDemo 報錯.png

 

原因: libavformatffmpeg 框架中的庫,而 ijkplayer 又是基於 ffmpeg 框架的,因此需要匯入 ffmpeg
解決辦法: 檢視 ijkplayer 的 README.md。


3、按照 README 中的說明下載並編譯編譯 ffmpeg

以下是 iOS 環境下下載並編譯 ffmpeg 的步驟

README 中的說明.png

第一步: 實際上就是下載 iOS 版的 ijkplayer,我們已經下載過了。
第二步: 切換到 ijkplayer-ios 目錄。

cd ijkplayer-ios

第三步: 表示建立並切換到 latest 分支。

git checkout -B latest k0.7.9

執行第三步之前,專案分支為 master

執行第三步之前,專案在 master 主幹.png

 

執行完第三步,專案分支為latest

執行終端命令png

 

執行第三步之後,專案在 latest 分支.png

注意:第三步建立分支的操作不是必須要做的,但是學習開源框架建立分支是一個好習慣。

第四步:下載 ffmpeg 原始碼

./init-ios.sh
  • init-ios.sh 表示一個 shell 指令碼檔案,它的作用就是 下載 ffmpeg 原始碼
  • ./ 表示在當前檔案
  • ./init-ios.sh 表示在當前資料夾執行指令碼檔案,下載 ffmpeg 框架

    執行指令碼檔案,下載 ffmpeg 框架.png

這個過程比較耗時,耐心等待~~~
N min後!!!
下載完成,就會發現 ijkplayer 中有 ffmpeg 了。

ijkplayer 中有 ffmpeg 了.png

 

下載好 ffmpeg,再次編譯 Demo

  • 發現: 還是報錯'libavformat/avformat.h' file not found
  • 原因: 執行 init-ios.sh,僅僅是下載原始碼,但是原始碼並沒有參與編譯,需要把原始碼編譯成 .a 檔案。`
  • 另外: IJKMediaDemo 依賴 IJKMediaPlayer,如圖

    IJKMediaDemo依賴IJKMediaPlayer.png

第五步: 開啟 IJKMediaPlayer,檢視原始碼
IJKMediaPlayer 位置

IJKMediaPlayer的位置.png

 

發現找不到對應的 .a 庫

找不到對應的.a庫.png

 

發現: ffmpeg 中的庫都是紅的,表示不存在,需要進行編譯。
解決: 繼續檢視 ijkplayer 的 README

編譯 ffmpeg 的命令.png

 


第六步: 編譯 ffmpeg 庫,分為三小步
步驟一: 進入指令碼檔案的目錄下

進入指令碼檔案所在目錄.png

 

步驟二: 執行 ./compile-ffmpeg.sh clean

執行指令碼檔案.png

./compile-ffmpeg.sh clean的作用:
  刪除一些檔案和資料夾,為編譯 ffmpeg.sh 做準備,在編譯ffmpeg.sh的時候,會自動建立剛才刪除的那些檔案,為避免檔名衝突,因此在編譯ffmpeg.sh之前,先刪除等一會會自動建立的檔案及資料夾。

步驟三: 執行./compile-ffmpeg.sh all,真正地編譯各個平臺的 ffmpeg 庫,並生成所有平臺的通用庫
執行 ./compile-ffmpeg.sh all 之前

執行指令碼之前

 

**執行 ./compile-ffmpeg.sh all **
執行指令碼,編譯 ffmpeg,編譯需要一段時間,耐心等待

執行指令碼之後.png

看到下面的介面,表示編譯完成

 

編譯完成.png

編譯完成之後

編譯完成之後,ijkplayer目錄結構.png


第七步: 再次執行 IJKMediaDemo
首先: 開啟 IJKMediaPlayer,檢視 ffmpeg 的庫檔案是否生成

ffmpeg庫檔案已經生成.png

 

可以看到: ffmpeg 的 .a庫都已經生成了。
然後: 開啟 IJKMediaDemo,並執行
執行成功,但是顯示如下:

Demo執行成功.png

 

原因: IJKMediaDemo 工程配置中,只支援橫屏

螢幕方向沒有支援豎屏.png

 

那麼,到此,整個 ffmpeg 的編譯工作就全部做完了。


三、打包 IJKMediaFrame.framework

要想將ijkplayer整合到專案中,有兩種方法:
第一種方法:
README 中的做法
這種方法其實就是跟 IJKMediaDemo工程那樣,直接匯入IJKMediaPlayer.xcodeproj,就不再介紹。
這個方法比較麻煩,不推薦

README方法.png

建議自己打包靜態庫。
第二種方法: 打包 IJKMediaFrame.framework框架
就是把 ijkplayer 打包成 framework匯入工程中使用。下面開始介紹如何打包IJKMediaPlayer.framework,按照下面步驟一步一步做:

1、首先,開啟工程 IJKMediaPlayer.xcodeproj,位置如下:

IJKMediaPlayer工程的位置.png

開啟後,如下圖:

 

IJKMediaPlayer工程.png

2、設定工程的 scheme

第一步: 選擇 Edit Scheme

選擇 Edit Scheme.png

 

第二步: 選擇是製作除錯用的framework還是釋出用的framework

選擇Debug或者Release.png

 

第三步: 設定好 scheme 後,分別選擇真機模式和模擬器進行編譯,編譯完成後,進入 Finder,如下圖

進入Finder.png

 

進入 Finder 後,可以看到,有真機和模擬器兩個版本的編譯結果,如下圖:

 

編譯結果.png

3、合併真機和模擬器版本的framework

注意: 不要合錯了,要合併的是這個檔案,如下圖:

要合併的檔案.png

 

開啟終端,進行合併,命令列的格式如下:

lipo -create "真機版本路徑" "模擬器版本路徑" -output "合併後的檔案路徑"

合併後,如下圖:

 

合併後的framework檔案.png

4、用合併生成的 IJKMediaFramework 替換掉原來的IJKMediaFramework

如圖:

 

操作示意圖.png

上圖中的1、2兩步完成後,藍色框中的那個IJKMediaFramework.framework檔案就是我們所需要的框架了,可以複製出來,稍後我們需要匯入專案中使用。
那麼,到此,用於 除錯(Debug)的 IJKMediaFramework.framework就製作完成了。
用於釋出(Release)的 IJKMediaFramework.framework 製作過程是類似的,就不再介紹。
已經將兩種模式下的 IJKMediaFramework.framework 上傳至網盤,
網盤分享連結: https://page13.ctfile.com/dir/14174113-21635467-cd9f24/


四、使用打包好的 IJKMediaFramework.framework 將 ijkplayer 整合到專案中

1、 新建工程,匯入合併後的 IJKMediaFramework.framework

除錯的話,拖入除錯版的 ijkplayer 庫
釋出的話,拖入釋出版的 ijkplayer 庫

 

匯入 IJKMediaFramework.framework.png


2、檢視 ijkplayer 的 README,匯入依賴庫

依賴庫.png

如圖,匯入依賴庫完成

 

匯入依賴庫完成.png

3、測試一下是否整合成功

ViewController.m中進行測試,首先匯入IJKMediaFramework.h標頭檔案,編譯一下,看有沒有報錯,如果沒有報錯,就說明整合成功了。
經過編譯,證實整合成功了。


五、使用 ijkplayer 實現一個簡單的直播視訊

1、ijkplayer 用法簡介

  • ijkplayer 用法比較簡單,其實只要有直播地址,就能直播
  • 注意: 最好是真機測試,模擬器測試比較卡,不流暢

2、抓取資料

#pragma mark - 載入網路資料
- (void)loadData {
   
    // 映客URL
    NSString *urlString = @"http://service.inke.com/api/live/simpleall?&gender=1&gps_info=116.346766%2C40.090413&loc_info=CN%2C%E5%8C%97%E4%BA%AC%E5%B8%82%2C%E5%8C%97%E4%BA%AC%E5%B8%82&is_new_user=1&lc=0000000000000053&cc=TG0001&cv=IK4.0.30_Iphone&proto=7&idfa=D7D0D5A2-3073-4A74-A726-98BE8B4E8F38&idfv=58A18E13-A21D-456D-B6D8-7499948B379D&devi=54b68af1895085419f7f8978d95d95257dd44f93&osversion=ios_10.300000&ua=iPhone6_2&imei=&imsi=&uid=450515766&sid=20XNNoa5VwMozGALfmi2xN1YCfLWvEq7aJuTHTQLu8bT88i1aNbi0&conn=wifi&mtid=391bb3520c38e0444ba0b3975f4bb1aa&mtxid=f0b42913a33c&logid=162,210&s_sg=89b4fd485d7c5ac30dc0dbf6042a06a9&s_sc=100&s_st=1493023925";
    
    // 請求資料
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain", nil];
    
    [manager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        // 字典轉模型
        _lives = [XDLive mj_objectArrayWithKeyValuesArray:responseObject[@"lives"]];
        
        // 重新整理表格
        [_tableView reloadData];
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@", error);
    }];
}

3、通過 拉流 URL 來觀看直播

#pragma mark - 播放直播
- (void)playLive {
    
    // 拉流 URL
    NSURL *liveURL = [NSURL URLWithString:_live.stream_addr];
    
    IJKFFMoviePlayerController *playerVC = [[IJKFFMoviePlayerController alloc] initWithContentURL:liveURL withOptions:nil];
    
    [self.view insertSubview:playerVC.view belowSubview:_backBtn];
    
    [playerVC.view mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self.view);
    }];
    
    // 記錄成員變數
    _playerVC = playerVC;
    
    [playerVC prepareToPlay];
    
    [playerVC play];
}

4、離開直播間,需要停止播放

#pragma mark - 當離開當前直播間的時候,要停止播放
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    
    // 介面消失,一定要記得停止播放
    [_playerVC pause];
    [_playerVC stop];
    [_playerVC shutdown];
}

5、最後,附上Demo地址

Demo地址
以上,是參照其它資料,自己親自動手實現的。



作者:XDLee
連結:https://www.jianshu.com/p/e4e4f7f3767d
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。

相關文章