iOS端集成ijkplayer實現直播#拉流#播放

前言
  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地址
以上,是參照其它資料,自己親自動手實現的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容