【如何快速的開發一個完整的iOS直播app】(原理篇)

前言

在看這篇之前,如果您還不了解直播原理,請查看上篇文章如何快速的開發一個完整的iOS直播app(原理篇)

開發一款直播app,集成ijkplayer成功后,就算完成直播功能一半的工程了,只要有拉流url,就能播放直播啦

本篇主要講解的是直播app中,需要用到的一個很重要的開源框架ijkplayer,然后集成這個框架可能對大多數初學者還是比較有難度的,所以本篇主要教你解決集成【ijkplayer】遇見的各種坑。

很多文章,可能講解的是如何做,我比較注重講解為什么這樣做,大家有什么不明白,還可以多多提出來。

如果喜歡我的文章,可以關注我微博:袁崢Seemygo,也可以來袁崢Seemygo,了解下我們的iOS培訓課程。后續還會更新更多內容,有任何問題,歡迎簡書留言崢吖。。。

效果

直播.gif

一、基本知識

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

bug1.png

原因:因為libavformat是ffmpeg中的庫,而ijkplayer是基于ffmpeg這個庫的,因此需要導入ffmpeg

解決:查看ijkplayer的README.md,一般都會有說明。

執行腳本.png

init-ios.sh腳本的作用:下載ffmpeg源碼

想了解腳本具體怎么做的,可以查看之前寫的文章帶你走進腳本世界,ijkplayer之【init-ios.sh】腳本分析,全面剖析了init-ios.sh這個腳本做了哪些事情。

如何執行init-ios.sh腳本文件

步驟一:找到init-ios.sh腳本文件

找到init-ios.sh文件.png

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

進入init-ios.sh目錄.png

注意是 cd 這個文件夾

cd ijkplayer-master.png

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

執行init-ios.sh.png

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

執行腳本后.png

2、下載好ffmpeg源碼后,再次運行Demo

發現還是報'libavformat/avformat.h' file not found錯誤

原因:執行init-ios.sh,僅僅是下載源碼,但是源碼并沒有參與編譯,需要把源碼編譯成.a文件

Demo依賴于IJKMediaPlayer庫

Demo源碼.png

打開? ? IJKMediaPlayer庫,查看下源碼

IJKMediaPlayer工程位置.png

打開? ? IJKMediaPlayer庫

IJKMediaPlayer源碼.png

右擊,發現FFMPEG中的庫都是紅的,表示不存在

Snip20160829_23.png

解決:查看ijkplayer的README.md

編譯ffmpeg.png

編譯ffmpeg庫

步驟一:進入到腳本文件的目錄下

cd? ios.png

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

步驟二功能:刪除一些文件和文件夾,為編譯ffmpeg.sh做準備,在編譯ffmpeg.sh的時候,會自動創建剛剛刪除的那些文件,為避免文件名沖突,因此在編譯ffmpeg.sh之前先刪除等會會自動創建的文件夾或者文件

Snip20160828_19.png

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

執行./compile-ffmpeg.sh all

執行compile-ffmpeg.sh all前

編譯前.png

執行compile-ffmpeg.sh all后

編譯后.png

3.再次運行Demo,就能成功了,因為IJKMediaPlayer庫獲取到ffmpeg庫了

編譯完ffmpeg后,IJKMediaPlayer庫中顯示

成功獲取到ffmpeg庫.png

cmd+r,Demo運行成功

Demo運行成功.png

四、如何集成到ijkplayer到自己的項目中

注意:ijkplayer的README中的方法比較麻煩,不方便攜帶,不推薦。

Snip20160830_9.png

1.推薦自己把IJKMediaPlayer打包成靜態庫,在導入到自己的項目中。

如何打包,請參考,iOS中集成ijkplayer視頻直播框架,寫的非常不錯,就不一一詳細介紹了,但是只有發布版本的庫。

我自己打包了ijkplayer兩個版本庫,分別用于調試和發布(DEBUG和Release),點擊下載

由于文件太大上傳不了GitHUb,就上傳到百度云了

2.直接把ijkplayer庫拖入到自己的工程中,

調試的話,拖入調試版本的ijkplayer庫,發布的話,拖入發布版本的ijkplayer庫

Snip20160829_5.png

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

Snip20160829_6.png

Snip20160829_7.png

五、使用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條數據,哈哈

- (void)loadData{// 映客數據urlNSString*urlStr =@"http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1";// 請求數據AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];? ? mgr.responseSerializer= [AFJSONResponseSerializer serializer];? ? mgr.responseSerializer.acceptableContentTypes= [NSSetsetWithObjects:@"text/plain",nil];? ? [mgr GET:urlStr parameters:nilprogress:nilsuccess:^(NSURLSessionDataTask* _Nonnull task,NSDictionary* _Nullable responseObject) {? ? ? ? _lives = [YZLiveItem mj_objectArrayWithKeyValuesArray:responseObject[@"lives"]];? ? ? ? [_tableView reloadData];? ? } failure:^(NSURLSessionDataTask* _Nullable task,NSError* _Nonnull error) {NSLog(@"%@",error);? ? }];}

3.獲取拉流url,直播

IJKFFMoviePlayerController:用來做直播的類

- (void)viewDidLoad {? ? [superviewDidLoad];self.view.backgroundColor= [UIColorwhiteColor];// 設置直播占位圖片NSURL*imageUrl = [NSURLURLWithString:[NSStringstringWithFormat:@"http://img.meelive.cn/%@",_live.creator.portrait]];? ? [self.imageViewsd_setImageWithURL:imageUrl placeholderImage:nil];// 拉流地址NSURL*url = [NSURLURLWithString:_live.stream_addr];// 創建IJKFFMoviePlayerController:專門用來直播,傳入拉流地址就好了IJKFFMoviePlayerController *playerVc = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:nil];// 準備播放[playerVc prepareToPlay];// 強引用,反正被銷毀_player = playerVc;? ? playerVc.view.frame= [UIScreenmainScreen].bounds;? ? [self.viewinsertSubview:playerVc.viewatIndex:1];}

4.結束播放

界面不播放,一定要記得結束播放,否則會報內存溢出

內存bug.png

- (void)viewWillDisappear:(BOOL)animated{? ? [superviewWillDisappear:animated];// 界面消失,一定要記得停止播放[_player pause];? ? [_player stop];}

結束語

后續還會更新更多有關直播的資料,希望做到教會每一個朋友從零開始做一款直播app,并且Demo也會慢慢完善.

Demo點擊下載

由于FFMPEG庫比較大,大概100M。

本來想自己上傳所有代碼了,上傳了1個小時,還沒成功,就放棄了。

提供另外一種方案,需要你們自己導入IJKPlayer庫

具體步驟:

下載Demo后,打開YZLiveApp.xcworkspace問題

打開YZLiveApp.xcworkspace問題

pod install就能解決

Snip20160830_12.png

下載jkplayer庫,點擊下載

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

拖入ijkplayer到與Classes同一級目錄下.png

注意不需要打開工程,把jkplayer拖入到工程中,而是直接把jkplayer庫拷貝到與Classes同一級目錄下就可以了。

錯誤示范:不要向下面這樣操作

Snip20160830_14.png

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

推薦閱讀更多精彩內容