iOS視頻直播:比較詳細的IJKPlay集成攻略

前言:剛來公司時士嚎,就接手了直播功能版塊的開發(fā)呜魄。推拉流走通了,邏輯框架和UI界面也都搭好了莱衩,但是因為資源問題爵嗅,老板決定放棄這個版塊。??
當時用的是網(wǎng)易云直播的sdk笨蚁,沒有集成IJKPlay睹晒,最近空閑時間比較多,就集成了一下IJKPlayer括细,使用很方便伪很,集成起來會麻煩一點


簡述下直播原理:
一個完整的直播程序,包括音視頻采集/處理奋单,視頻轉(zhuǎn)碼锉试,解碼拉取等。概括來說览濒,要有下面幾個環(huán)節(jié)進行配合:
推流端:采集主播的音視頻信息呆盖,進行美顏、變聲贷笛、信息編碼应又,將媒體流推流至服務器。
服務器端:對媒體流進行轉(zhuǎn)碼乏苦,錄制等處理株扛,分發(fā)數(shù)據(jù)。
拉流端:從服務器拉取媒體流汇荐,進行解碼席里、渲染、提供音視頻播放環(huán)境拢驾。
互動系統(tǒng):聊天室奖磁、彈幕、點贊繁疤。

其中核心環(huán)節(jié)無外乎就是 推/拉流 過程咖为,集成IJKPlayer,可以方便我們在這一步驟上所做的處理稠腊。

一. 什么是IJKPlayer躁染?
 ijkplayer是B站的一款開源框架褪迟,專門用來做視頻直播歼冰,基于ffmpeg,同時支持 Android 和 iOS 平臺曹动。
  對于 App 中的直播功能,如果我們成功集成ijkplayer 饰恕,那么只要得到一個拉流 URL挠羔,就能實現(xiàn)簡單的音視頻直播功能了。

二. 下載IJKPlayer
IJKPlayer下載地址

三. 運行demo埋嵌,編譯IJKPlayer
下載IJKPlayer時破加,在README里面已經(jīng)告訴了我們應該如何集成IJKPlayer,所以在編譯demo前雹嗦,應當在終端中按照圖中步驟進行相應操作范舀,如果沒有按照上面的提示步驟,而是直接運行demo了罪,因為缺少文件锭环,編譯器就會報錯,
readme中提示步驟:

15281511405703_.pic_hd.jpg

  1. 打開終端泊藕,cd到IJKPlayer文件夾:


    281511406394_.pic.jpg
  2. 執(zhí)行./init-ios.sh命令(等待下載···):


    291511406757_.pic_hd.jpg

進程結(jié)束后辅辩,會發(fā)現(xiàn)extra文件夾下會多出這兩個文件:


321511406885_.pic_hd.jpg
  1. cd到ios文件夾下:


    331511407052_.pic_hd.jpg
  2. 依次執(zhí)行:./compile-ffmpeg.sh clean 和 ./compile-ffmpeg.sh all命令(等待編譯ffmpeg···),過程比較久吱七,要耐心等待一會


    351511407246_.pic_hd.jpg
  3. 進程結(jié)束后,查看是否編譯成功:


    361511407709_.pic_hd.jpg
  4. 打開IJKPlayerDemo鹤竭,進行編譯:


    371511408035_.pic_hd.jpg

四. 打包IJKPlayer進行集成
集成IJKPlayer有兩種方式:

  1. 按照README中的方法踊餐,和demo中一樣,將IJKMediaPlayer.xcodeproj導入到我們自己的項目中臀稚,直接按照README中的提示進行操作吝岭,這里不做多余贅述。
# Demo
#     open ios/IJKMediaDemo/IJKMediaDemo.xcodeproj with Xcode
# 
# Import into Your own Application
#     Select your project in Xcode.
#     File -> Add Files to ... -> Select ios/IJKMediaPlayer/IJKMediaPlayer.xcodeproj
#     Select your Application's target.
#     Build Phases -> Target Dependencies -> Select IJKMediaFramework
#     Build Phases -> Link Binary with Libraries -> Add:
#         IJKMediaFramework.framework
#
#         AudioToolbox.framework
#         AVFoundation.framework
#         CoreGraphics.framework
#         CoreMedia.framework
#         CoreVideo.framework
#         libbz2.tbd
#         libz.tbd
#         MediaPlayer.framework
#         MobileCoreServices.framework
#         OpenGLES.framework
#         QuartzCore.framework
#         UIKit.framework
#         VideoToolbox.framework
#
#         ... (Maybe something else, if you get any link error)
# 
  1. 將IJKPlayer打包成framework吧寺,導入到項目中:
  2. 打開IJKMediaPlayer.xcodeproj


    381511408585_.pic_hd.jpg

注:這里有兩個target窜管,IJKMediaFramework 和 IJKMediaFrameworkWithSSL,在支持https的情況下稚机,我們選擇IJKMediaFrameworkWithSSL進行編譯:


391511408751_.pic.jpg
  1. 將編譯環(huán)境調(diào)成release模式:
401511409209_.pic_hd.jpg
411511409311_.pic_hd.jpg
  1. 分別在真機和模擬器上進行編譯幕帆,機型不限。

    如果編譯報錯“l(fā)ibrary not found for -lcrypto”赖条,說明缺少文件
    421511413966_.pic.jpg
431511414031_.pic_hd.jpg

解決方法:我的解決方法是下載libcrypto和libssl文件拷貝到當前項目下失乾。
我在電腦上全局搜這兩個文件,發(fā)現(xiàn)之前的第三方里有這兩個文件纬乍,就直接拿來用了:
拷貝到文件夾下


441511414573_.pic_hd.jpg

添加文件:


471511414848_.pic_hd.jpg
461511414831_.pic_hd.jpg

再次編譯碱茁。

  1. 編譯成功后,進入Finder中仿贬,查看編譯結(jié)果:


    481511415200_.pic_hd.jpg
  2. 將真機和模擬器上編譯生成的文件進行合并纽竣,要合并的文件在圖中進行了標記:


    491511415276_.pic_hd.jpg
501511415331_.pic_hd.jpg

在終端執(zhí)行合成命令:

 lipo -create 真機版本編譯后文件路徑 模擬器版本編譯后文件路徑 -output 合成后路徑(這里我放在Products文件夾下)

注: 合成后路徑指的是:合成后所放的文件夾/合成后的文件名,這里我把合成后文件命名為:“IJKMediaFrameWithSSL”,合成后路徑為:/Build/Products/IJKMediaFrameWithSSL

執(zhí)行完成后蜓氨,在Products文件夾下看到新的合成文件:


511511416000_.pic_hd.jpg

使用新的合成文件聋袋,替換掉真機版本編譯后文件路徑下的文件:

521511416273_.pic_hd.jpg

五. 將IJKPlayer集成到項目中

  1. 將打包好的IJKPlayer靜態(tài)庫和一些依賴庫添加到項目中:


    531511416591_.pic_hd.jpg
  2. 編譯查看是否報錯:

這里暫時發(fā)現(xiàn)的有兩個錯誤:

1、xxx does not contain bitcode:
xcode默認開啟了bitcode语盈,如果我們集成的庫沒有bitcode編譯的包舱馅,則有可能出現(xiàn)報錯。

解決方法:target-->build setting-->enable bitcode-->NO

541511416828_.pic_hd.jpg
  1. 運行時crash刀荒,提示:dyld: Library not loaded: @rpath xxx reason: image not found
    出現(xiàn)這種錯誤代嗤,是因為在運行時沒有找到framewok對應的包,如果運行到這個包時缠借,就會崩潰干毅。

解決方法:
手動添加framework到項目中:


551511417370_.pic_hd.jpg
561511417418_.pic_hd.jpg
571511417463_.pic_hd.jpg

六. 模仿demo,進行測試:

這里我寫了一個tableView泼返,鏈接到不同的拉流地址:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    NSURL *url = [NSURL URLWithString:_dataArray[indexPath.row]];
    
    NSString *scheme = [[url scheme]lowercaseString];
    
    if ([scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"] || [scheme isEqualToString:@"rtmp"]) {
        
        [XSIJKMediaPlayerViewController presentFromViewController:self withTitle:@"Livestream" URL:_dataArray[indexPath.row] completion:nil];
    }
    
}

放入測試地址:

- (void)requestData{
    
    NSArray *urls = @[@"rtmp://live.hkstv.hk.lxdns.com/live/hks",@"http://wzfree.10043.doftp.com/tvtest/182tv.php/live/id/suntv.m3u8",@"invalidUrl"];
    _dataArray = [[NSMutableArray alloc]initWithArray:urls];
    
    [_tableView reloadData];
    
}

在直播頁面的ViewController中進行配置:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    
    self.view.backgroundColor = [UIColor grayColor];
#ifdef DEBUG
    //設置是否打印信息
    [IJKFFMoviePlayerController setLogReport:YES];
    
    [IJKFFMoviePlayerController setLogLevel:k_IJK_LOG_DEBUG];
    
#else
    [IJKFFMoviePlayerController setLogReport:NO];
    [IJKFFMoviePlayerController setLogLevel:k_IJK_LOG_INFO];
#endif
    
    [IJKFFMoviePlayerController checkIfFFmpegVersionMatch:YES];
    
    //配置參數(shù):數(shù)據(jù)處理硝逢、videotoolbox解碼、設置音視頻屬性參數(shù)設置
    IJKFFOptions *options = [IJKFFOptions optionsByDefault];
    
    self.player = [[IJKFFMoviePlayerController alloc]initWithContentURL:self.url withOptions:options];
    self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
    self.player.view.frame = self.view.bounds;
    self.player.scalingMode = IJKMPMovieScalingModeAspectFit;
    self.player.shouldAutoplay = YES;
    
    self.view.autoresizesSubviews = YES;
    [self.view addSubview:self.player.view];
    
    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(20, 20, 40, 40)];
    [btn setTitle:@"返回" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(leftClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
}

運行效果:

Simulator Screen Shot - iPhone 6 - 2017-11-23 at 14.22.45.png
QQ20171123-143125.gif

這里只寫了簡單的拉流绅喉,代碼很簡單渠鸽,就不上demo了,其他相關代碼可以看IJKPlayer的demo柴罐,里面寫的很詳細徽缚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市革屠,隨后出現(xiàn)的幾起案子凿试,更是在濱河造成了極大的恐慌,老刑警劉巖似芝,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件那婉,死亡現(xiàn)場離奇詭異,居然都是意外死亡党瓮,警方通過查閱死者的電腦和手機详炬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寞奸,“玉大人痕寓,你說我怎么就攤上這事∮眨” “怎么了呻率?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呻引。 經(jīng)常有香客問我礼仗,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任元践,我火速辦了婚禮韭脊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘单旁。我一直安慰自己沪羔,他們只是感情好,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布象浑。 她就那樣靜靜地躺著蔫饰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愉豺。 梳的紋絲不亂的頭發(fā)上篓吁,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音蚪拦,去河邊找鬼杖剪。 笑死,一個胖子當著我的面吹牛驰贷,可吹牛的內(nèi)容都是我干的盛嘿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼括袒,長吁一口氣:“原來是場噩夢啊……” “哼次兆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起箱熬,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤类垦,失蹤者是張志新(化名)和其女友劉穎狈邑,沒想到半個月后城须,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡米苹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年糕伐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蘸嘶。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡良瞧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出训唱,到底是詐尸還是另有隱情褥蚯,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布况增,位于F島的核電站赞庶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歧强,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一澜薄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摊册,春花似錦肤京、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至温治,卻和暖如春饭庞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熬荆。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工舟山, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卤恳。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓累盗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親突琳。 傳聞我的和親對象是個殘疾皇子若债,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

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