iOS開(kāi)發(fā)集成Bilibili/ijkplayer做視頻直播

由于2016年直播行業(yè)特別火驶兜,也越來(lái)越多的人想做直播舀凛】“猓可是視頻直播一些傳輸協(xié)議(RTMP基于HTTP協(xié)議),視頻采用什么H.264壓縮猛遍,音頻采用ACC等等這些太復(fù)雜了馋记。所以我們需要集成第三方号坡,下面我就為大家詳細(xì)講解集成步驟,不足之處歡迎交流 抗果。 ? ? ? ?QQ1725865030?

1.框架名字: Bilibili/ijkplayer

注意事項(xiàng):把Bilibili/ijkplayer下載下來(lái)你會(huì)發(fā)現(xiàn)這個(gè)文件很小筋帖,打開(kāi)iOS里面的IJKMediaDemo也報(bào)錯(cuò)找不到#include "libavformat/avformat.h"這個(gè)文件。這個(gè)時(shí)候我們要在終端下載Bilibili/ijkplayer冤馏,具體步驟GitHub里面有說(shuō)明日麸,因?yàn)槲募容^大就不一一講解了。(弄不好的朋友可以加上方的@QQ我會(huì)把源碼也給你逮光,源碼里面的步驟我標(biāo)記的比較清晰)

2.接下來(lái)就是添加依賴的庫(kù)了


3.接下來(lái)我們就要拷貝一些我們需要的代碼了(這里我們需要簡(jiǎn)單的直播代碼我已經(jīng)拷貝下來(lái)了你直接創(chuàng)建一個(gè)繼承于ViewController控制器就行了代箭,把下面這些代碼全部粘貼到你的.m文件里)

#import "DKPlayerViewController.h"http://第1步#import@interface DKPlayerViewController ()//第1.1步@property(atomic, retain) idplayer;

@end

@implementation DKPlayerViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.navigationController.navigationBarHidden = YES;

[self initPlayer];

}

//第1.2步

- (void)viewWillAppear:(BOOL)animated {

[super viewWillAppear:animated];

self.navigationController.navigationBarHidden = YES;

//注冊(cè)直播需要用的通知

[self installMovieNotificationObservers];

//準(zhǔn)備播放

[self.player prepareToPlay];

}

//第1.3步

- (void)viewWillDisappear:(BOOL)animated {

[super viewWillDisappear:animated];

//關(guān)閉直播

[self.player shutdown];

//移除

[self removeMovieNotificationObservers];

}

#pragma mark Install Movie Notifications

//1.4

/* Register observers for the various movie object notifications. */

-(void)installMovieNotificationObservers

{

//監(jiān)聽(tīng)網(wǎng)絡(luò)環(huán)境,監(jiān)聽(tīng)緩沖方法

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(loadStateDidChange:)

name:IJKMPMoviePlayerLoadStateDidChangeNotification

object:_player];

//監(jiān)聽(tīng)直播完成回調(diào)

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(moviePlayBackDidFinish:)

name:IJKMPMoviePlayerPlaybackDidFinishNotification

object:_player];

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(mediaIsPreparedToPlayDidChange:)

name:IJKMPMediaPlaybackIsPreparedToPlayDidChangeNotification

object:_player];

//監(jiān)聽(tīng)用戶主動(dòng)操作

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(moviePlayBackStateDidChange:)

name:IJKMPMoviePlayerPlaybackStateDidChangeNotification

object:_player];

}

#pragma mark Remove Movie Notification Handlers

//1.5

/* Remove the movie notification observers from the movie object. */

-(void)removeMovieNotificationObservers

{

[[NSNotificationCenter defaultCenter]removeObserver:self name:IJKMPMoviePlayerLoadStateDidChangeNotification object:_player];

[[NSNotificationCenter defaultCenter]removeObserver:self name:IJKMPMoviePlayerPlaybackDidFinishNotification object:_player];

[[NSNotificationCenter defaultCenter]removeObserver:self name:IJKMPMediaPlaybackIsPreparedToPlayDidChangeNotification object:_player];

[[NSNotificationCenter defaultCenter]removeObserver:self name:IJKMPMoviePlayerPlaybackStateDidChangeNotification object:_player];

}

//1.6

- (void)loadStateDidChange:(NSNotification*)notification

{

//? ? MPMovieLoadStateUnknown? ? ? ? = 0,未知

//? ? MPMovieLoadStatePlayable? ? ? = 1 << 0,緩沖結(jié)束可以播放

//? ? MPMovieLoadStatePlaythroughOK? = 1 << 1, // Playback will be automatically started in this state when shouldAutoplay is YES 緩沖結(jié)束自動(dòng)播放

//? ? MPMovieLoadStateStalled? ? ? ? = 1 << 2, // Playback will be automatically paused in this state, if started

//暫停

IJKMPMovieLoadState loadState = _player.loadState;

if ((loadState & IJKMPMovieLoadStatePlaythroughOK) != 0) {

NSLog(@"loadStateDidChange: IJKMPMovieLoadStatePlaythroughOK: %d\n", (int)loadState);

} else if ((loadState & IJKMPMovieLoadStateStalled) != 0) {

NSLog(@"loadStateDidChange: IJKMPMovieLoadStateStalled: %d\n", (int)loadState);

} else {

NSLog(@"loadStateDidChange: ???: %d\n", (int)loadState);

}

//? ? self.blurImageView.hidden = YES;

//? ? [self.blurImageView removeFromSuperview];

}

//1.7

- (void)moviePlayBackDidFinish:(NSNotification*)notification

{

//? ? MPMovieFinishReasonPlaybackEnded, 直播結(jié)束

//? ? MPMovieFinishReasonPlaybackError, 直播錯(cuò)誤

//? ? MPMovieFinishReasonUserExited? 用戶退出

int reason = [[[notification userInfo] valueForKey:IJKMPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue];

switch (reason)

{

case IJKMPMovieFinishReasonPlaybackEnded:

NSLog(@"playbackStateDidChange: IJKMPMovieFinishReasonPlaybackEnded: %d\n", reason);

break;

case IJKMPMovieFinishReasonUserExited:

NSLog(@"playbackStateDidChange: IJKMPMovieFinishReasonUserExited: %d\n", reason);

break;

case IJKMPMovieFinishReasonPlaybackError:

NSLog(@"playbackStateDidChange: IJKMPMovieFinishReasonPlaybackError: %d\n", reason);

break;

default:

NSLog(@"playbackPlayBackDidFinish: ???: %d\n", reason);

break;

}

}

//1.8

- (void)mediaIsPreparedToPlayDidChange:(NSNotification*)notification

{

NSLog(@"mediaIsPreparedToPlayDidChange\n");

}

- (void)moviePlayBackStateDidChange:(NSNotification*)notification

{

//? ? MPMoviePlaybackStateStopped,

//? ? MPMoviePlaybackStatePlaying,

//? ? MPMoviePlaybackStatePaused,

//? ? MPMoviePlaybackStateInterrupted,

//? ? MPMoviePlaybackStateSeekingForward,

//? ? MPMoviePlaybackStateSeekingBackward

switch (_player.playbackState)

{

case IJKMPMoviePlaybackStateStopped: {

NSLog(@"IJKMPMoviePlayBackStateDidChange %d: stoped", (int)_player.playbackState);

break;

}

case IJKMPMoviePlaybackStatePlaying: {

NSLog(@"IJKMPMoviePlayBackStateDidChange %d: playing", (int)_player.playbackState);

break;

}

case IJKMPMoviePlaybackStatePaused: {

NSLog(@"IJKMPMoviePlayBackStateDidChange %d: paused", (int)_player.playbackState);

break;

}

case IJKMPMoviePlaybackStateInterrupted: {

NSLog(@"IJKMPMoviePlayBackStateDidChange %d: interrupted", (int)_player.playbackState);

break;

}

case IJKMPMoviePlaybackStateSeekingForward:

case IJKMPMoviePlaybackStateSeekingBackward: {

NSLog(@"IJKMPMoviePlayBackStateDidChange %d: seeking", (int)_player.playbackState);

break;

}

default: {

NSLog(@"IJKMPMoviePlayBackStateDidChange %d: unknown", (int)_player.playbackState);

break;

}

}

}

//1.9設(shè)置播放的player

- (void)initPlayer {

IJKFFOptions * options = [IJKFFOptions optionsByDefault];

//(每條數(shù)據(jù)都有相對(duì)應(yīng)主播的URL這個(gè)看你后臺(tái)怎么命名了)

IJKFFMoviePlayerController * player = [[IJKFFMoviePlayerController alloc] initWithContentURLString:self.live.stream_addr withOptions:options];

self.player = player;

self.player.view.frame = self.view.bounds;

self.player.shouldAutoplay = YES;

[self.view addSubview:self.player.view];

}

4.接下來(lái)就是傳賦值了在tableViewController里面寫(xiě)

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

[tableView deselectRowAtIndexPath:indexPath animated:YES];

DKTrendModel *live = self.live[indexPath.row];

DKPlayerViewController *playerVC = [[DKPlayerViewController alloc]init];

playerVC.live = live;

//? ? playerVC.hidesBottomBarWhenPushed = YES;

[self.navigationController pushViewController:playerVC animated:YES];

}

5.到這一步算基本完成簡(jiǎn)單直播了涕刚,接下來(lái)給你看看直播的效果


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗡综,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子杜漠,更是在濱河造成了極大的恐慌极景,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驾茴,死亡現(xiàn)場(chǎng)離奇詭異盼樟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)锈至,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門晨缴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人峡捡,你說(shuō)我怎么就攤上這事击碗。” “怎么了们拙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵稍途,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我砚婆,道長(zhǎng)晰房,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任射沟,我火速辦了婚禮殊者,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘验夯。我一直安慰自己猖吴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布挥转。 她就那樣靜靜地躺著海蔽,像睡著了一般共屈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上党窜,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天拗引,我揣著相機(jī)與錄音,去河邊找鬼幌衣。 笑死矾削,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的豁护。 我是一名探鬼主播哼凯,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼楚里!你這毒婦竟也來(lái)了断部?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤班缎,失蹤者是張志新(化名)和其女友劉穎蝴光,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體达址,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虱疏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苏携。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡对粪,死狀恐怖右冻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情著拭,我是刑警寧澤纱扭,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站儡遮,受9級(jí)特大地震影響乳蛾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鄙币,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一肃叶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧十嘿,春花似錦因惭、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)激率。三九已至,卻和暖如春勿决,著一層夾襖步出監(jiān)牢的瞬間乒躺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工低缩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘉冒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓表制,卻偏偏與公主長(zhǎng)得像健爬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子么介,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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