開發一款直播app,集成ijkplayer成功后,就算完成直播功能一半的工程了,只要有拉流url,就能播放直播啦
本篇主要講解的是直播app中,需要用到的一個很重要的開源框架ijkplayer,然后集成這個框架可能對大多數初學者還是比較有難度的,所以本篇主要教你解決集成【ijkplayer】遇見的各種坑。
很多文章,可能講解的是如何做,我比較注重講解為什么這樣做,大家有什么不明白,還可以多多提出來。
如果喜歡我的文章,可以關注我微博:袁崢Seemygo,也可以來袁崢Seemygo,了解下我們的iOS培訓課程。后續還會更新更多內容,有任何問題,歡迎簡書留言崢吖。。。
 直播.gif
直播.gifREADME.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腳本文件后綴名
 Snip20160825_4.png
Snip20160825_4.png bug1.png
bug1.png原因:因為libavformat是ffmpeg中的庫,而ijkplayer是基于ffmpeg這個庫的,因此需要導入ffmpeg
解決:查看ijkplayer的README.md,一般都會有說明。
 執行腳本.png
執行腳本.pnginit-ios.sh腳本的作用:下載ffmpeg源碼
想了解腳本具體怎么做的,可以查看之前寫的文章帶你走進腳本世界,ijkplayer之【init-ios.sh】腳本分析,全面剖析了init-ios.sh這個腳本做了哪些事情。 找到init-ios.sh文件.png步驟二:打開終端,cd進入到ijkplayer-master的目錄中
找到init-ios.sh文件.png步驟二:打開終端,cd進入到ijkplayer-master的目錄中 進入init-ios.sh目錄.png注意是 cd 這個文件夾
進入init-ios.sh目錄.png注意是 cd 這個文件夾 cd ijkplayer-master.png步驟三:輸入./init-ios.sh,就會執行當前腳本了。
cd ijkplayer-master.png步驟三:輸入./init-ios.sh,就會執行當前腳本了。 執行init-ios.sh.png執行完腳本后,就會發現ijkplayer中有ffmpeg了
執行init-ios.sh.png執行完腳本后,就會發現ijkplayer中有ffmpeg了 執行腳本后.png
執行腳本后.png Demo源碼.png打開 IJKMediaPlayer庫,查看下源碼
Demo源碼.png打開 IJKMediaPlayer庫,查看下源碼 IJKMediaPlayer工程位置.png
IJKMediaPlayer工程位置.png打開 IJKMediaPlayer庫
 IJKMediaPlayer源碼.png
IJKMediaPlayer源碼.png右擊,發現FFMPEG中的庫都是紅的,表示不存在
 Snip20160829_23.png
Snip20160829_23.png解決:查看ijkplayer的README.md
 編譯ffmpeg.png
編譯ffmpeg.png cd ios.png步驟二:執行./compile-ffmpeg.sh clean步驟二功能:刪除一些文件和文件夾,為編譯ffmpeg.sh做準備,在編譯ffmpeg.sh的時候,會自動創建剛剛刪除的那些文件,為避免文件名沖突,因此在編譯ffmpeg.sh之前先刪除等會會自動創建的文件夾或者文件
cd ios.png步驟二:執行./compile-ffmpeg.sh clean步驟二功能:刪除一些文件和文件夾,為編譯ffmpeg.sh做準備,在編譯ffmpeg.sh的時候,會自動創建剛剛刪除的那些文件,為避免文件名沖突,因此在編譯ffmpeg.sh之前先刪除等會會自動創建的文件夾或者文件 Snip20160828_19.png步驟三:執行./compile-ffmpeg.sh all,真正的編譯各個平臺的ffmpeg庫,并生成所以平臺的通用庫.
Snip20160828_19.png步驟三:執行./compile-ffmpeg.sh all,真正的編譯各個平臺的ffmpeg庫,并生成所以平臺的通用庫. 執行./compile-ffmpeg.sh all
執行./compile-ffmpeg.sh all 編譯前.png
編譯前.png 編譯后.png
編譯后.png編譯完ffmpeg后,IJKMediaPlayer庫中顯示
 成功獲取到ffmpeg庫.png
成功獲取到ffmpeg庫.pngcmd+r,Demo運行成功
 Demo運行成功.png
Demo運行成功.png Snip20160830_9.png
Snip20160830_9.png Snip20160829_5.png
Snip20160829_5.png Snip20160829_6.png
Snip20160829_6.png Snip20160829_7.png
Snip20160829_7.png- (void)loadData{    // 映客數據url    NSString *urlStr = @"http://116.211.167.106/api/live/aggregation?uid=133825214&interest=1";    // 請求數據    AFHTTPsessionManager *mgr = [AFHTTPSessionManager manager];    mgr.responseSerializer = [AFJSONResponseSerializer serializer];    mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", nil];    [mgr GET:urlStr parameters:nil PRogress:nil success:^(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 {    [super viewDidLoad];    self.view.backgroundColor = [UIColor whiteColor];    // 設置直播占位圖片    NSURL *imageUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://img.meelive.cn/%@",_live.creator.portrait]];    [self.imageView sd_setImageWithURL:imageUrl placeholderImage:nil];    // 拉流地址    NSURL *url = [NSURL URLWithString:_live.stream_addr];    // 創建IJKFFMoviePlayerController:專門用來直播,傳入拉流地址就好了    IJKFFMoviePlayerController *playerVc = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:nil];    // 準備播放    [playerVc prepareToPlay];    // 強引用,反正被銷毀    _player = playerVc;    playerVc.view.frame = [UIScreen mainScreen].bounds;    [self.view insertSubview:playerVc.view atIndex:1];}4.結束播放
界面不播放,一定要記得結束播放,否則會報內存溢出 內存bug.png
內存bug.png- (void)viewWillDisappear:(BOOL)animated{    [super viewWillDisappear:animated];    // 界面消失,一定要記得停止播放    [_player pause];    [_player stop];}結束語
后續還會更新更多有關直播的資料,希望做到教會每一個朋友從零開始做一款直播app,并且Demo也會慢慢完善.Demo點擊下載
由于FFMPEG庫比較大,大概100M。本來想自己上傳所有代碼了,上傳了1個小時,還沒成功,就放棄了。提供另外一種方案,需要你們自己導入IJKPlayer庫具體步驟:
下載Demo后,打開YZLiveApp.xcworkspace問題 打開YZLiveApp.xcworkspace問題pod install就能解決
打開YZLiveApp.xcworkspace問題pod install就能解決 Snip20160830_12.png下載jkplayer庫,點擊下載把jkplayer直接拖入到與Classes同一級目錄下,直接運行程序,就能成功了
Snip20160830_12.png下載jkplayer庫,點擊下載把jkplayer直接拖入到與Classes同一級目錄下,直接運行程序,就能成功了 拖入ijkplayer到與Classes同一級目錄下.png注意不需要打開工程,把jkplayer拖入到工程中,而是直接把jkplayer庫拷貝到與Classes同一級目錄下就可以了。錯誤示范:不要向下面這樣操作
拖入ijkplayer到與Classes同一級目錄下.png注意不需要打開工程,把jkplayer拖入到工程中,而是直接把jkplayer庫拷貝到與Classes同一級目錄下就可以了。錯誤示范:不要向下面這樣操作 原文鏈接:http://www.jianshu.com/p/7b2f1df74420
原文鏈接:http://www.jianshu.com/p/7b2f1df74420
| 
 
 | 
新聞熱點
疑難解答