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

原文轉自:袁崢Seemygo    感謝分享、自我學習

前言

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

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

本篇主要講解的是直播app中,須要用到的一個很重要的開源框架ijkplayer,而後集成這個框架可能對大多數初學者仍是比較有難度的,因此本篇主要教你解決集成【ijkplayer】碰見的各類坑ios

不少文章,可能講解的是如何作,我比較注重講解爲何這樣作,你們有什麼不明白,還能夠多多提出來git

效果


直播.gif

1、基本知識

README.md文件:框架的描述文件,描述這個框架怎麼使用程序員

編譯語言:程序在被執行以前,須要一個專門的編譯過程,把程序編譯成爲機器語言的文件,運行時不須要翻譯,因此編譯型語言的程序執行效率高,好比OC,C,C++github

解釋性語言:解釋性語言的程序不須要編譯,在運行程序的時候才翻譯,每一個語句都是執行的時候才翻譯。這樣解釋性語言每執行一次就須要逐行翻譯一次,效率比較低shell

解釋性語言執行和編譯語言執行的區別windows

  • 解釋性語言一行一行的解析,若是有錯誤,就不會執行,直接執行下一行。
  • 編譯語言,只要有錯,就不能編譯,一行都不能執行。

腳本語言:屬於解析語言,必須經過解釋器解析,將其一條條的翻譯成機器可識別的指令,並按程序順序執行。api

  • python:腳本語言,適合網絡應用程序的開發,有利於開發效率,如今顯得愈來愈強大
  • PHP:服務器端腳本語言,適合作動態網站
  • JS:做爲客戶端的腳本語言,在瀏覽中解釋執行,
  • shell:操做系統腳本語言,通常指Unix/Linux中使用的命令行
  • 編譯語言,執行文件是二進制。腳本語言是解釋執行的,執行文件是文本

shell解釋器:shell是一個命令行解釋器,至關於windows的cmd,處於內核和用戶之間,負責把用戶的指令傳遞給內核而且把執行結果回顯給用戶.bash

  • 默認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腳本文件後綴名

2、下載ijkPlayer

  • 去到B站得github主頁,找到ijkplayer項目,下載源碼 ijkplayer下載地址
  • 打開Demo,查看用法,通常學習第三方庫,都是先查看Demo

    Snip20160825_4.png

3、編譯ijkPlayer的步驟

一、找到ijkPlayerMediaDemo並運行

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

bug1.png

緣由:由於libavformat是ffmpeg中的庫,而ijkplayer是基於ffmpeg這個庫的,所以須要導入ffmpeg

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


執行腳本.png

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

如何執行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

二、下載好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

4、如何集成到ijkplayer到本身的項目中

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

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

5、使用ijkplayer直播

1.ijkplayer用法簡介

  • ijkplayer用法比較簡單,其實只要有直播地址,就能直播了
  • 注意:最好真機測試,模擬器測試比較卡,不流暢,真機就沒有問題了

2.抓取數據

- (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
- (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就能解決

Snip20160830_12.png
  • 下載jkplayer庫,點擊下載
  • 把jkplayer直接拖入到與Classes同一級目錄下,直接運行程序,就能成功了

拖入ijkplayer到與Classes同一級目錄下.png
  • 注意不須要打開工程,把jkplayer拖入到工程中,而是直接把jkplayer庫拷貝到與Classes同一級目錄下就能夠了。
  • 錯誤示範:不要向下面這樣操做

Snip20160830_14.png
相關文章
相關標籤/搜索