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

前言

在看這篇之前抛猖,如果您還不了解直播原理压语,請(qǐng)查看上篇文章如何快速的開發(fā)一個(gè)完整的iOS直播app(原理篇)

開發(fā)一款直播app吁朦,集成ijkplayer成功后,就算完成直播功能一半的工程了履磨,只要有拉流url蛉抓,就能播放直播啦

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

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

如果喜歡我的文章飞蹂,可以關(guān)注我微博:袁崢Seemygo,也可以來袁崢Seemygo,了解下我們的iOS培訓(xùn)課程翻屈。后續(xù)還會(huì)更新更多內(nèi)容,有任何問題陈哑,歡迎簡書留言崢吖。伸眶。惊窖。

效果

直播.gif

一、基本知識(shí)

README.md文件:框架的描述文件厘贼,描述這個(gè)框架怎么使用

編譯語言:程序在被執(zhí)行之前界酒,需要一個(gè)專門的編譯過程,把程序編譯成為機(jī)器語言的文件嘴秸,運(yùn)行時(shí)不需要翻譯毁欣,所以編譯型語言的程序執(zhí)行效率高,比如OC,C,C++

解釋性語言:解釋性語言的程序不需要編譯岳掐,在運(yùn)行程序的時(shí)候才翻譯凭疮,每個(gè)語句都是執(zhí)行的時(shí)候才翻譯。這樣解釋性語言每執(zhí)行一次就需要逐行翻譯一次岩四,效率比較低

解釋性語言執(zhí)行和編譯語言執(zhí)行的區(qū)別:

解釋性語言一行一行的解析哭尝,如果有錯(cuò)誤,就不會(huì)執(zhí)行剖煌,直接執(zhí)行下一行材鹦。

編譯語言,只要有錯(cuò)耕姊,就不能編譯桶唐,一行都不能執(zhí)行。

腳本語言:屬于解析語言茉兰,必須通過解釋器解析尤泽,將其一條條的翻譯成機(jī)器可識(shí)別的指令,并按程序順序執(zhí)行。

python:腳本語言坯约,適合網(wǎng)絡(luò)應(yīng)用程序的開發(fā)熊咽,有利于開發(fā)效率,現(xiàn)在顯得越來越強(qiáng)大

PHP:服務(wù)器端腳本語言闹丐,適合做動(dòng)態(tài)網(wǎng)站

JS:作為客戶端的腳本語言横殴,在瀏覽中解釋執(zhí)行,

shell:操作系統(tǒng)腳本語言卿拴,一般指Unix/Linux中使用的命令行

編譯語言衫仑,執(zhí)行文件是二進(jìn)制。腳本語言是解釋執(zhí)行的堕花,執(zhí)行文件是文本

shell解釋器:shell是一個(gè)命令行解釋器文狱,相當(dāng)于windows的cmd,處于內(nèi)核和用戶之間,負(fù)責(zé)把用戶的指令傳遞給內(nèi)核并且把執(zhí)行結(jié)果回顯給用戶.

默認(rèn)Unix都有shell,OS基于Unix,因此OS自帶shell缘挽。

bash: bash是一種shell解釋器版本瞄崇,shell有很多種版本,就像人到踏,也分不同國家的人杠袱。

牛程序員看到不爽的Shell解釋器,就會(huì)自己重新寫一套窝稿,慢慢形成了一些標(biāo)準(zhǔn)楣富,常用的Shell解釋器有這么幾種,sh伴榔、bash纹蝴、csh等

shell:通常我們說的shell,指的是shell腳本語言,而不是shell解釋器踪少。

在編寫shell時(shí)塘安,第一行一定要指明系統(tǒng)需要哪種shell解釋器解釋你的shell腳本,如:#! /bin/bash援奢,使用bash解析腳本語言

什么時(shí)候使用shell命令兼犯,比如有些系統(tǒng)命令經(jīng)常需要用到,可以把命令封裝到一個(gè)腳本文件集漾,以后就不用再敲一遍了切黔,直接執(zhí)行腳本語言。

比如ijkplayer,就用腳本文件下載ffmpeg,因?yàn)橄螺dffmpeg需要執(zhí)行很多命令具篇,全部封裝到腳本文件中纬霞。

在導(dǎo)入一些第三方框架的時(shí)候,經(jīng)常需要用到一些命令驱显,所以一般都會(huì)封裝到一個(gè)腳本文件中诗芜,以后只要執(zhí)行腳本瞳抓,就會(huì)自動(dòng)執(zhí)行集成第三方框架的命令。

sh:sheel腳本文件后綴名

二伏恐、下載ijkPlayer

去到B站得github主頁孩哑,找到ijkplayer項(xiàng)目,下載源碼ijkplayer下載地址

打開Demo脐湾,查看用法臭笆,一般學(xué)習(xí)第三方庫叙淌,都是先查看Demo

Snip20160825_4.png

三秤掌、編譯ijkPlayer的步驟

1、找到ijkPlayerMediaDemo并運(yùn)行

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

bug1.png

原因:因?yàn)閘ibavformat是ffmpeg中的庫鹰霍,而ijkplayer是基于ffmpeg這個(gè)庫的闻鉴,因此需要導(dǎo)入ffmpeg

解決:查看ijkplayer的README.md,一般都會(huì)有說明茂洒。

執(zhí)行腳本.png

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

想了解腳本具體怎么做的孟岛,可以查看之前寫的文章帶你走進(jìn)腳本世界,ijkplayer之【init-ios.sh】腳本分析督勺,全面剖析了init-ios.sh這個(gè)腳本做了哪些事情渠羞。

如何執(zhí)行init-ios.sh腳本文件

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

找到init-ios.sh文件.png

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

進(jìn)入init-ios.sh目錄.png

注意是 cd 這個(gè)文件夾

cd ijkplayer-master.png

步驟三:輸入./init-ios.sh智哀,就會(huì)執(zhí)行當(dāng)前腳本了次询。

執(zhí)行init-ios.sh.png

執(zhí)行完腳本后,就會(huì)發(fā)現(xiàn)ijkplayer中有ffmpeg了

執(zhí)行腳本后.png

2瓷叫、下載好ffmpeg源碼后屯吊,再次運(yùn)行Demo

發(fā)現(xiàn)還是報(bào)'libavformat/avformat.h' file not found錯(cuò)誤

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

Demo依賴于IJKMediaPlayer庫

Demo源碼.png

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

IJKMediaPlayer工程位置.png

打開? ? IJKMediaPlayer庫

IJKMediaPlayer源碼.png

右擊次氨,發(fā)現(xiàn)FFMPEG中的庫都是紅的蔽介,表示不存在

Snip20160829_23.png

解決:查看ijkplayer的README.md

編譯ffmpeg.png

編譯ffmpeg庫

步驟一:進(jìn)入到腳本文件的目錄下

cd? ios.png

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

步驟二功能:刪除一些文件和文件夾,為編譯ffmpeg.sh做準(zhǔn)備煮寡,在編譯ffmpeg.sh的時(shí)候虹蓄,會(huì)自動(dòng)創(chuàng)建剛剛刪除的那些文件,為避免文件名沖突洲押,因此在編譯ffmpeg.sh之前先刪除等會(huì)會(huì)自動(dòng)創(chuàng)建的文件夾或者文件

Snip20160828_19.png

步驟三:執(zhí)行./compile-ffmpeg.sh all,真正的編譯各個(gè)平臺(tái)的ffmpeg庫武花,并生成所以平臺(tái)的通用庫.

執(zhí)行./compile-ffmpeg.sh all

執(zhí)行compile-ffmpeg.sh all前

編譯前.png

執(zhí)行compile-ffmpeg.sh all后

編譯后.png

3.再次運(yùn)行Demo,就能成功了,因?yàn)镮JKMediaPlayer庫獲取到ffmpeg庫了

編譯完ffmpeg后,IJKMediaPlayer庫中顯示

成功獲取到ffmpeg庫.png

cmd+r,Demo運(yùn)行成功

Demo運(yùn)行成功.png

四杈帐、如何集成到ijkplayer到自己的項(xiàng)目中

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

Snip20160830_9.png

1.推薦自己把IJKMediaPlayer打包成靜態(tài)庫,在導(dǎo)入到自己的項(xiàng)目中累铅。

如何打包跃须,請(qǐng)參考,iOS中集成ijkplayer視頻直播框架娃兽,寫的非常不錯(cuò)菇民,就不一一詳細(xì)介紹了,但是只有發(fā)布版本的庫。

我自己打包了ijkplayer兩個(gè)版本庫投储,分別用于調(diào)試和發(fā)布(DEBUG和Release),點(diǎn)擊下載

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

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

調(diào)試的話,拖入調(diào)試版本的ijkplayer庫玛荞,發(fā)布的話娇掏,拖入發(fā)布版本的ijkplayer庫

Snip20160829_5.png

3.導(dǎo)入ijkplayer依賴的庫,具體可以查看ijkplayer的README

Snip20160829_6.png

Snip20160829_7.png

五勋眯、使用ijkplayer直播

1.ijkplayer用法簡介

ijkplayer用法比較簡單婴梧,其實(shí)只要有直播地址,就能直播了

注意:最好真機(jī)測(cè)試客蹋,模擬器測(cè)試比較卡,不流暢塞蹭,真機(jī)就沒有問題了

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

抓了很多直播app的數(shù)據(jù),發(fā)現(xiàn)映客主播的質(zhì)量是最高的讶坯。

映客主播url:http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1

uid=賬號(hào)ID番电,這里是我的賬號(hào)ID

interest=興趣 ,1表示只查看女生闽巩,哈哈

上下拉刷新的接口沒抓到钧舌,就一下加載200條數(shù)據(jù),哈哈

- (void)loadData{// 映客數(shù)據(jù)urlNSString*urlStr =@"http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1";// 請(qǐng)求數(shù)據(jù)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];// 設(shè)置直播占位圖片NSURL*imageUrl = [NSURLURLWithString:[NSStringstringWithFormat:@"http://img.meelive.cn/%@",_live.creator.portrait]];? ? [self.imageViewsd_setImageWithURL:imageUrl placeholderImage:nil];// 拉流地址NSURL*url = [NSURLURLWithString:_live.stream_addr];// 創(chuàng)建IJKFFMoviePlayerController:專門用來直播涎跨,傳入拉流地址就好了IJKFFMoviePlayerController *playerVc = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:nil];// 準(zhǔn)備播放[playerVc prepareToPlay];// 強(qiáng)引用洼冻,反正被銷毀_player = playerVc;? ? playerVc.view.frame= [UIScreenmainScreen].bounds;? ? [self.viewinsertSubview:playerVc.viewatIndex:1];}

4.結(jié)束播放

界面不播放,一定要記得結(jié)束播放隅很,否則會(huì)報(bào)內(nèi)存溢出

內(nèi)存bug.png

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

結(jié)束語

后續(xù)還會(huì)更新更多有關(guān)直播的資料,希望做到教會(huì)每一個(gè)朋友從零開始做一款直播app叔营,并且Demo也會(huì)慢慢完善.

Demo點(diǎn)擊下載

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

本來想自己上傳所有代碼了绒尊,上傳了1個(gè)小時(shí)畜挥,還沒成功,就放棄了婴谱。

提供另外一種方案蟹但,需要你們自己導(dǎo)入IJKPlayer庫

具體步驟:

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

打開YZLiveApp.xcworkspace問題

pod install就能解決

Snip20160830_12.png

下載jkplayer庫,點(diǎn)擊下載

把jkplayer直接拖入到與Classes同一級(jí)目錄下华糖,直接運(yùn)行程序麦向,就能成功了

拖入ijkplayer到與Classes同一級(jí)目錄下.png

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

錯(cuò)誤示范:不要向下面這樣操作

Snip20160830_14.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市兼搏,隨后出現(xiàn)的幾起案子卵慰,更是在濱河造成了極大的恐慌,老刑警劉巖向族,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呵燕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡件相,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門氧苍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夜矗,“玉大人,你說我怎么就攤上這事让虐∥伤海” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵赡突,是天一觀的道長对扶。 經(jīng)常有香客問我,道長惭缰,這世上最難降的妖魔是什么浪南? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮漱受,結(jié)果婚禮上络凿,老公的妹妹穿的比我還像新娘。我一直安慰自己昂羡,他們只是感情好絮记,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虐先,像睡著了一般怨愤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛹批,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天撰洗,我揣著相機(jī)與錄音膀息,去河邊找鬼。 笑死了赵,一個(gè)胖子當(dāng)著我的面吹牛潜支,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柿汛,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼冗酿,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了络断?” 一聲冷哼從身側(cè)響起裁替,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎貌笨,沒想到半個(gè)月后弱判,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锥惋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年昌腰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膀跌。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遭商,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捅伤,到底是詐尸還是另有隱情劫流,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布丛忆,位于F島的核電站祠汇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏熄诡。R本人自食惡果不足惜可很,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粮彤。 院中可真熱鬧根穷,春花似錦、人聲如沸导坟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惫周。三九已至尘惧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間递递,已是汗流浹背喷橙。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工啥么, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贰逾。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓悬荣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疙剑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氯迂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容