前言
在看這篇之前,如果您還不了解直播原理,請查看上篇文章如何快速的開發一個完整的iOS直播app(原理篇)
開發一款直播app,集成ijkplayer成功后,就算完成直播功能一半的工程了,只要有拉流url,就能播放直播啦
本篇主要講解的是直播app中,需要用到的一個很重要的開源框架ijkplayer
,然后集成這個框架可能對大多數初學者
還是比較有難度的,所以本篇主要教你解決集成【ijkplayer】遇見的各種坑
。
很多文章,可能講解的是如何做,我比較注重講解為什么
這樣做,大家有什么不明白,還可以多多提出來
。
如果喜歡我的文章,可以關注我微博:袁崢Seemygo,也可以來袁崢Seemygo,了解下我們的iOS培訓課程。后續還會更新更多內容,有任何問題,歡迎簡書留言
崢吖。。。
效果

一、基本知識
README.md文件
:框架的描述文件,描述這個框架怎么使用
編譯語言
:程序在被執行之前,需要一個專門的編譯過程,把程序編譯成為機器語言的文件,運行時不需要翻譯,所以編譯型語言的程序執行效率高,比如OC,C,C++
解釋性語言
:解釋性語言的程序不需要編譯,在運行程序的時候才翻譯,每個語句都是執行的時候才翻譯。這樣解釋性語言每執行一次就需要逐行翻譯一次,效率比較低
解釋性語言執行和編譯語言執行的區別
:
- 解釋性語言一行一行的解析,如果有錯誤,就不會執行,直接執行下一行。
- 編譯語言,只要有錯,就不能編譯,一行都不能執行。
腳本語言
:屬於解析語言,必須通過解釋器解析,將其一條條的翻譯成機器可識別的指令,並按程序順序執行。
- python:腳本語言,適合網絡應用程序的開發,有利於開發效率,現在顯得越來越強大
- PHP:服務器端腳本語言,適合做動態網站
- JS:作為客戶端的腳本語言,在瀏覽中解釋執行,
- shell:操作系統腳本語言,一般指Unix/Linux中使用的命令行
- 編譯語言,執行文件是二進制。腳本語言是解釋執行的,執行文件是文本
shell解釋器
:shell是一個命令行解釋器,相當於windows的cmd,處於內核和用戶之間,負責把用戶的指令傳遞給內核並且把執行結果回顯給用戶.
- 默認Unix都有shell,OS基於Unix,因此OS自帶shell。
bash
: bash是一種shell解釋器版本,shell有很多種版本,就像人,也分不同國家的人。
- 牛程序員看到不爽的Shell解釋器,就會自己重新寫一套,慢慢形成了一些標准,常用的Shell解釋器有這么幾種,sh、bash、csh等
shell
:通常我們說的shell,指的是shell腳本語言,而不是shell解釋器。
- 在編寫shell時,第一行一定要指明系統需要哪種shell解釋器解釋你的shell腳本,如:#! /bin/bash,使用bash解析腳本語言
-
什么時候使用shell命令
,比如有些系統命令經常需要用到,可以把命令封裝到一個腳本文件,以后就不用再敲一遍了,直接執行腳本語言。 - 比如ijkplayer,就用腳本文件下載ffmpeg,因為下載ffmpeg需要執行很多命令,全部封裝到腳本文件中。
- 在導入一些第三方框架的時候,經常需要用到一些命令,所以一般都會封裝到一個腳本文件中,以后只要執行腳本,就會自動執行集成第三方框架的命令。
sh
:sheel腳本文件后綴名
二、下載ijkPlayer
- 去到B站得github主頁,找到ijkplayer項目,下載源碼 ijkplayer下載地址
- 打開Demo,查看用法,
一般學習第三方庫,都是先查看Demo
Snip20160825_4.png
三、編譯ijkPlayer的步驟
1、找到ijkPlayerMediaDemo並運行
- 提示
'libavformat/avformat.h' file not found

原因
:因為libavformat是ffmpeg中的庫,而ijkplayer是基於ffmpeg這個庫的,因此需要導入ffmpeg
解決
:查看ijkplayer的README.md,一般都會有說明。

init-ios.sh
腳本的作用:下載ffmpeg源碼
- 想了解腳本具體怎么做的,可以查看之前寫的文章帶你走進腳本世界,ijkplayer之【init-ios.sh】腳本分析,全面剖析了
init-ios.sh
這個腳本做了哪些事情。
如何執行init-ios.sh
腳本文件
-
步驟一:
找到init-ios.sh腳本文件

-
步驟二:
打開終端,cd進入到ijkplayer-master的目錄中

- 注意是 cd 這個文件夾

-
步驟三:
輸入./init-ios.sh,就會執行當前腳本了。

- 執行完腳本后,就會發現ijkplayer中有
ffmpeg
了

2、下載好ffmpeg源碼后,再次運行Demo
- 發現還是報
'libavformat/avformat.h' file not found
錯誤 -
原因
:執行init-ios.sh,僅僅是下載源碼
,但是源碼並沒有參與編譯,需要把源碼編譯成.a文件- Demo依賴於IJKMediaPlayer庫

- 打開 IJKMediaPlayer庫,查看下源碼

-
打開 IJKMediaPlayer庫
IJKMediaPlayer源碼.png -
右擊,發現FFMPEG中的庫都是紅的,表示不存在
Snip20160829_23.png -
解決
:查看ijkplayer的README.md

編譯ffmpeg庫
- 步驟一:進入到
腳本文件
的目錄下
cd ios.png
- 步驟二:執行
./compile-ffmpeg.sh clean
- 步驟二功能:刪除一些文件和文件夾,為編譯ffmpeg.sh做准備,在編譯ffmpeg.sh的時候,會自動創建剛剛刪除的那些文件,為避免文件名沖突,因此在編譯ffmpeg.sh之前先刪除等會會自動創建的文件夾或者文件

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

執行compile-ffmpeg.sh all前

執行compile-ffmpeg.sh all后

3.再次運行Demo,就能成功了,因為IJKMediaPlayer庫獲取到ffmpeg庫了
-
編譯完ffmpeg后,IJKMediaPlayer庫中顯示
成功獲取到ffmpeg庫.png -
cmd+r,Demo運行成功

四、如何集成到ijkplayer到自己的項目中
- 注意:
ijkplayer
的README
中的方法比較麻煩,不方便攜帶,不推薦。

1.推薦自己把IJKMediaPlayer打包成靜態庫,在導入到自己的項目中。
- 如何打包,請參考,iOS中集成ijkplayer視頻直播框架,寫的非常不錯,就不一一詳細介紹了,但是
只有發布版本的庫
。 - 我自己打包了ijkplayer兩個版本庫,分別用於調試和發布(DEBUG和Release),點擊下載
- 由於文件太大上傳不了GitHUb,就上傳到百度雲了
2.直接把ijkplayer庫拖入到自己的工程中,
- 調試的話,拖入調試版本的ijkplayer庫,發布的話,拖入發布版本的ijkplayer庫

3.導入ijkplayer依賴的庫,具體可以查看ijkplayer的README


五、使用ijkplayer直播
1.ijkplayer用法簡介
- ijkplayer用法比較簡單,其實只要有直播地址,就能直播了
- 注意:最好
真機測試
,模擬器測試比較卡,不流暢
,真機就沒有問題了
2.抓取數據
- 抓了很多直播app的數據,發現映客主播的質量是最高的。
- 映客主播url:http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1
- uid=賬號ID,這里是我的賬號ID
- interest=興趣 ,1表示只查看女生,哈哈
- 上下拉刷新的接口沒抓到,就一下加載200條數據,哈哈
1 - (void)loadData 2 { 3 // 映客數據url 4 NSString *urlStr = @"http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1"; 5 6 // 請求數據 7 AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager]; 8 mgr.responseSerializer = [AFJSONResponseSerializer serializer]; 9 mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", nil]; 10 [mgr GET:urlStr parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary * _Nullable responseObject) { 11 12 _lives = [YZLiveItem mj_objectArrayWithKeyValuesArray:responseObject[@"lives"]]; 13 14 [_tableView reloadData]; 15 16 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 17 18 NSLog(@"%@",error); 19 20 }]; 21 }
3.獲取拉流url,直播
IJKFFMoviePlayerController
:用來做直播的類
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 4 self.view.backgroundColor = [UIColor whiteColor]; 5 6 // 設置直播占位圖片 7 NSURL *imageUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://img.meelive.cn/%@",_live.creator.portrait]]; 8 [self.imageView sd_setImageWithURL:imageUrl placeholderImage:nil]; 9 10 // 拉流地址 11 NSURL *url = [NSURL URLWithString:_live.stream_addr]; 12 13 // 創建IJKFFMoviePlayerController:專門用來直播,傳入拉流地址就好了 14 IJKFFMoviePlayerController *playerVc = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:nil]; 15 16 // 准備播放 17 [playerVc prepareToPlay]; 18 19 // 強引用,反正被銷毀 20 _player = playerVc; 21 22 playerVc.view.frame = [UIScreen mainScreen].bounds; 23 24 [self.view insertSubview:playerVc.view atIndex:1]; 25 26 } 27
4.結束播放
- 界面不播放,一定要記得結束播放,否則會報內存溢出

1 - (void)viewWillDisappear:(BOOL)animated 2 { 3 [super viewWillDisappear:animated]; 4 5 // 界面消失,一定要記得停止播放 6 [_player pause]; 7 [_player stop]; 8 }
結束語
后續還會更新更多有關直播的資料,希望做到教會每一個朋友從零開始做一款直播app,並且Demo也會慢慢完善.
Demo點擊下載
- 由於FFMPEG庫比較大,大概100M。
- 本來想自己上傳所有代碼了,上傳了1個小時,還沒成功,就放棄了。
- 提供另外一種方案,需要你們自己導入IJKPlayer庫
具體步驟:
- 下載Demo后,打開YZLiveApp.xcworkspace問題

- pod install就能解決

- 下載jkplayer庫,點擊下載
- 把jkplayer直接拖入到與Classes同一級目錄下,直接運行程序,就能成功了

- 注意不需要
打開工程,把jkplayer拖入到工程中
,而是直接把jkplayer庫拷貝到與Classes同一級目錄下就可以了。 - 錯誤示范:
不要向下面這樣操作

原文鏈接:http://www.jianshu.com/p/7b2f1df74420
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。