iOS端集成ijkplayer實現(xiàn)直播#拉流#播放

前言
  ijkplayer框架是專門用來做 視頻直播 的開源框架,基于ffmpeg,同時支持 AndroidiOS 平臺。
  對于 App 中的直播功能,如果我們成功集成ijkplayer ,那么就算完成一半的工程了。接下來,只要獲取到 拉流 URL,就能實現(xiàn)視頻直播功能了。
  但是初次集成這個框架,對于新手還是有一定難度的。
  本篇主要介紹如何快速集成 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 環(huán)境下下載并編譯 ffmpeg 的步驟

README 中的說明.png

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

cd ijkplayer-ios

第三步: 表示創(chuàng)建并切換到 latest 分支。

git checkout -B latest k0.7.9

執(zhí)行第三步之前,項目分支為 master

執(zhí)行第三步之前,項目在 master 主干.png

執(zhí)行完第三步,項目分支為latest

執(zhí)行終端命令png

執(zhí)行第三步之后,項目在 latest 分支.png

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

第四步:下載 ffmpeg 源碼

./init-ios.sh
  • init-ios.sh 表示一個 shell 腳本文件,它的作用就是 下載 ffmpeg 源碼
  • ./ 表示在當前文件
  • ./init-ios.sh 表示在當前文件夾執(zhí)行腳本文件,下載 ffmpeg 框架
    執(zhí)行腳本文件,下載 ffmpeg 框架.png

這個過程比較耗時,耐心等待~~~
N min后?。?!
下載完成,就會發(fā)現(xiàn) ijkplayer 中有 ffmpeg 了。

ijkplayer 中有 ffmpeg 了.png

下載好 ffmpeg,再次編譯 Demo

  • 發(fā)現(xiàn): 還是報錯'libavformat/avformat.h' file not found
  • 原因: 執(zhí)行 init-ios.sh,僅僅是下載源碼,但是源碼并沒有參與編譯,需要把源碼編譯成 .a 文件。`
  • 另外: IJKMediaDemo 依賴 IJKMediaPlayer,如圖
    IJKMediaDemo依賴IJKMediaPlayer.png

第五步: 打開 IJKMediaPlayer,查看源碼
IJKMediaPlayer 位置

IJKMediaPlayer的位置.png

發(fā)現(xiàn)找不到對應的 .a 庫

找不到對應的.a庫.png

發(fā)現(xiàn): ffmpeg 中的庫都是紅的,表示不存在,需要進行編譯。
解決: 繼續(xù)查看 ijkplayer 的 README

編譯 ffmpeg 的命令.png


第六步: 編譯 ffmpeg 庫,分為三小步
步驟一: 進入腳本文件的目錄下

進入腳本文件所在目錄.png

步驟二: 執(zhí)行 ./compile-ffmpeg.sh clean

執(zhí)行腳本文件.png

./compile-ffmpeg.sh clean的作用:
  刪除一些文件和文件夾,為編譯 ffmpeg.sh 做準備,在編譯ffmpeg.sh的時候,會自動創(chuàng)建剛才刪除的那些文件,為避免文件名沖突,因此在編譯ffmpeg.sh之前,先刪除等一會會自動創(chuàng)建的文件及文件夾。

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

執(zhí)行腳本之前

**執(zhí)行 ./compile-ffmpeg.sh all **
執(zhí)行腳本,編譯 ffmpeg,編譯需要一段時間,耐心等待

執(zhí)行腳本之后.png

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


編譯完成.png

編譯完成之后

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

第七步: 再次運行 IJKMediaDemo
首先: 打開 IJKMediaPlayer,查看 ffmpeg 的庫文件是否生成

ffmpeg庫文件已經(jīng)生成.png

可以看到: ffmpeg 的 .a庫都已經(jīng)生成了。
然后: 打開 IJKMediaDemo,并運行
運行成功,但是顯示如下:

Demo運行成功.png

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

屏幕方向沒有支持豎屏.png

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


三、打包 IJKMediaFrame.framework

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

README方法.png

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

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

IJKMediaPlayer工程的位置.png

打開后,如下圖:


IJKMediaPlayer工程.png

2、設置工程的 scheme

第一步: 選擇 Edit Scheme

選擇 Edit Scheme.png

第二步: 選擇是制作調(diào)試用的framework還是發(fā)布用的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文件就是我們所需要的框架了,可以復制出來,稍后我們需要導入項目中使用。
那么,到此,用于 調(diào)試(Debug)的 IJKMediaFramework.framework就制作完成了。
用于發(fā)布(Release)的 IJKMediaFramework.framework 制作過程是類似的,就不再介紹。
已經(jīng)將兩種模式下的 IJKMediaFramework.framework 上傳至網(wǎng)盤,
網(wǎng)盤分享鏈接: https://page13.ctfile.com/dir/14174113-21635467-cd9f24/


四、使用打包好的 IJKMediaFramework.framework 將 ijkplayer 集成到項目中

1、 新建工程,導入合并后的 IJKMediaFramework.framework

調(diào)試的話,拖入調(diào)試版的 ijkplayer 庫
發(fā)布的話,拖入發(fā)布版的 ijkplayer 庫


導入 IJKMediaFramework.framework.png

2、查看 ijkplayer 的 README,導入依賴庫

依賴庫.png

如圖,導入依賴庫完成


導入依賴庫完成.png

3、測試一下是否集成成功

ViewController.m中進行測試,首先導入IJKMediaFramework.h頭文件,編譯一下,看有沒有報錯,如果沒有報錯,就說明集成成功了。
經(jīng)過編譯,證實集成成功了。


五、使用 ijkplayer 實現(xiàn)一個簡單的直播視頻

1、ijkplayer 用法簡介

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

2、抓取數(shù)據(jù)

#pragma mark - 加載網(wǎng)絡數(shù)據(jù)
- (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";
    
    // 請求數(shù)據(jù)
    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地址
以上,是參照其它資料,自己親自動手實現(xiàn)的。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容