在看這篇以前,若是您還不瞭解直播原理,請查看上篇文章如何快速的開發一個完整的iOS直播app(原理篇)html
開發一款直播app,集成ijkplayer成功後,就算完成直播功能一半的工程了,只要有拉流url,就能播放直播啦python
本篇主要講解的是直播app中,須要用到的一個很重要的開源框架ijkplayer
,而後集成這個框架可能對大多數初學者
仍是比較有難度的,因此本篇主要教你解決集成【ijkplayer】碰見的各類坑
。ios
不少文章,可能講解的是如何作,我比較注重講解爲何
這樣作,你們有什麼不明白,還能夠多多提出來
。git
README.md文件
:框架的描述文件,描述這個框架怎麼使用程序員
編譯語言
:程序在被執行以前,須要一個專門的編譯過程,把程序編譯成爲機器語言的文件,運行時不須要翻譯,因此編譯型語言的程序執行效率高,好比OC,C,C++github
解釋性語言
:解釋性語言的程序不須要編譯,在運行程序的時候才翻譯,每一個語句都是執行的時候才翻譯。這樣解釋性語言每執行一次就須要逐行翻譯一次,效率比較低shell
解釋性語言執行和編譯語言執行的區別
:windows
腳本語言
:屬於解析語言,必須經過解釋器解析,將其一條條的翻譯成機器可識別的指令,並按程序順序執行。api
shell解釋器
:shell是一個命令行解釋器,至關於windows的cmd,處於內核和用戶之間,負責把用戶的指令傳遞給內核而且把執行結果回顯給用戶.bash
bash
: bash是一種shell解釋器版本,shell有不少種版本,就像人,也分不一樣國家的人。
shell
:一般咱們說的shell,指的是shell腳本語言,而不是shell解釋器。
何時使用shell命令
,好比有些系統命令常常須要用到,能夠把命令封裝到一個腳本文件,之後就不用再敲一遍了,直接執行腳本語言。sh
:sheel腳本文件後綴名
通常學習第三方庫,都是先查看Demo
'libavformat/avformat.h' file not found
緣由
:由於libavformat是ffmpeg中的庫,而ijkplayer是基於ffmpeg這個庫的,所以須要導入ffmpeg
解決
:查看ijkplayer的README.md,通常都會有說明。
init-ios.sh
腳本的做用:下載ffmpeg源碼
init-ios.sh
這個腳本作了哪些事情。init-ios.sh
腳本文件步驟一:
找到init-ios.sh腳本文件步驟二:
打開終端,cd進入到ijkplayer-master的目錄中步驟三:
輸入./init-ios.sh,就會執行當前腳本了。ffmpeg
了'libavformat/avformat.h' file not found
錯誤緣由
:執行init-ios.sh,僅僅是下載源碼
,可是源碼並無參與編譯,須要把源碼編譯成.a文件
打開 IJKMediaPlayer庫
右擊,發現FFMPEG中的庫都是紅的,表示不存在
解決
:查看ijkplayer的README.md
腳本文件
的目錄下./compile-ffmpeg.sh clean
編譯完ffmpeg後,IJKMediaPlayer庫中顯示
cmd+r,Demo運行成功
ijkplayer
的README
中的方法比較麻煩,不方便攜帶,不推薦。只有發佈版本的庫
。真機測試
,模擬器測試比較卡,不流暢
,真機就沒有問題了- (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); }]; }
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]; }
- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // 界面消失,必定要記得中止播放 [_player pause]; [_player stop]; }
後續還會更新更多有關直播的資料,但願作到教會每個朋友從零開始作一款直播app,而且Demo也會慢慢完善.
Demo點擊下載
打開工程,把jkplayer拖入到工程中
,而是直接把jkplayer庫拷貝到與Classes同一級目錄下就能夠了。不要向下面這樣操做