iOS 本地nginx LFLiveKit IJKPlayer的一系列直播推流拉流操作

1.nginx rtmp本地推流拉流服務(wù)器搭建
1.1 安裝 (沒安裝brew的同學(xué),闊以看下這篇文章http://blog.csdn.net/wdd1324/article/details/72769789

 sudo brew install nginx

1.2 查看版本號

nginx -v

安裝成功則返回 nginx version: nginx/1.12.2
1.3 啟動nginx

sudo nginx

如果報錯

nginx: [emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)

這個是端口被占用,我們可以殺死其他占用該端口號的進程或者在nginx.conf里修改端口號
先說殺死一個進程的方法线得,后面會說到修改nginx.conf

sudo lsof -i tcp:8080

然后找到PID值斋泄,再kill掉該進程

kill PID

再次啟動 nginx
啟動成功
打開瀏覽器 輸入http://localhost:8080 出現(xiàn)以下界面則成功


1.4 配置nginx
打開終端 cd到nginx目錄下

cd /usr/local/etc/nginx

運行vim 打開nginx.conf

vim nginx.conf

配置rtmp (這里可以不用做配置匆笤,直接用一個端口就能實現(xiàn)推拉净薛,推拉都為同一個端口)
listen為監(jiān)聽的端口號,192.168.4.205是我本地的ip地址啊胶,我用一個src作為推流地址,一個des作為拉流地址垛贤,用ffmpeg將輸入源接入輸出源焰坪,360x480為輸出的分辨率

rtmp {

    server {

        listen 8080;

        chunk_size 4000;

# TV mode: one publisher, many subscribers
        application src {

# enable live streaming
            live on;
            interleave on;
            wait_key on;

# publish only from localhost
            allow publish all;
#deny publish all;

            allow play all;
 exec /usr/local/opt/ffmpeg/bin/ffmpeg  -i rtmp://192.168.4.205:8080/src -vcodec libx264 -vprofile main -tune zerolatency -s 360x480 -pix_fmt yuv420p -movflags +faststart -preset ultrafast  -f flv rtmp://192.168.4.205:8080/des;
        }
        application des {
            live on;
            interleave on;
            wait_key on;
        }
    }
}

1.5 重啟nginx

sudo nginx -s reload

這樣就OK啦,可以在mac上通過OBS來推流聘惦,VLC來拉流測試是否成功某饰。

1.6 其他命令與問題
關(guān)閉nginx

sudo nginx -s stop

2.使用LFLiveKit來推流(采用的是h264視頻編碼,ACC的音頻硬編碼)
2.1用Pods來添加LFLiveKit

pod 'LFLiveKit'

2.2LFLiveSession初始化
設(shè)置視頻圖像的分辨率

    LFLiveVideoConfiguration *config = [LFLiveVideoConfiguration defaultConfigurationForQuality:LFLiveVideoQuality_Low1];
    config.videoSize = CGSizeMake(360, 512);   //圖片分辨率

初始化session

    _session = [[LFLiveSession alloc] initWithAudioConfiguration:[LFLiveAudioConfiguration defaultConfigurationForQuality:LFLiveAudioQuality_Low] videoConfiguration:config captureType:LFLiveCaptureMaskVideo];
    _session.preView= self.livingPushView;    //推流預(yù)覽
    _session.captureDevicePosition = AVCaptureDevicePositionUnspecified;    //設(shè)置為后置攝像頭部凑,默認為前置攝像頭
    _session.beautyFace = NO;    //是否美顏
    _session.running = YES;    //是否播放(默認為NO的露乏,不添加則無預(yù)覽圖像)
    _session.delegate = self;    //設(shè)置代理

2.3LFLive的代理方法
根據(jù)代理可以查看到推流狀態(tài)

- (void)liveSession:(nullable LFLiveSession *)session liveStateDidChange:(LFLiveState)state {
    switch (state) {
        case LFLiveReady: {
            NSLog(@"-準(zhǔn)備");
        }
            break;
        case LFLivePending: {
            NSLog(@"-連接中");
        }
            break;
        case LFLiveStart: {
            NSLog(@"-已連接");
        }
            break;
        case LFLiveStop: {
            NSLog(@"-已斷開");
        }
            break;
        case LFLiveError: {
            NSLog(@"-連接出錯");
        }
            break;
        case LFLiveRefresh: {
            NSLog(@"-正在刷新");
        }
            break;
        default:
            break;
    }
}

2.4 開始推流

    LFLiveStreamInfo *stream = [LFLiveStreamInfo new];
    stream.url = @"rtmp://192.168.4.205:8080/src";
    [self.session startLive:stream];

界面消失的時候停止推流

    [self.session stopLive];

下面我們看一下拉流

  1. IJKPlayer
    3.1IJKMediaFramework集成
    大家闊以看下這片文章,寫得很詳細
    http://www.reibang.com/p/1f06b27b3ac0
    3.2 IJKMediaFramework集成成功后涂邀,在使用的地方導(dǎo)入
    #import <IJKMediaFramework/IJKFFOptions.h>
    #import <IJKMediaFramework/IJKMediaPlayer.h>
    #import <IJKMediaFramework/IJKFFMoviePlayerController.h>

3.3 配置IJKFFOptions

    IJKFFOptions *options = [IJKFFOptions optionsByDefault];
    [options setPlayerOptionValue:@"1" forKey:@"an"];  //靜音設(shè)置
    [options setPlayerOptionValue:@"1" forKey:@"videotoolbox"];  //開啟硬解碼
    [options setPlayerOptionIntValue:10 forKey:@"max-buffer-size"];  //最大緩存
    [options setFormatOptionIntValue:10 forKey:@"rtbufsize"];   //緩存
    [options setFormatOptionIntValue:2000000 forKey:@"analyzeduration"]; 
    [options setFormatOptionValue:@"nobuffer" forKey:@"fflags"];
    [options setFormatOptionIntValue:4096 forKey:@"probsize"];

這是樓主的一些配置參數(shù)瘟仿。
3.4 IJKFFMoviePlayerController初始化

    self.player = [[IJKFFMoviePlayerController alloc] initWithContentURLString:_ipstring2 withOptions:options];        
    self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
    self.player.view.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);  
    self.player.view.backgroundColor = [UIColor blackColor];
    self.player.scalingMode = IJKMPMovieScalingModeAspectFill; //縮放模式
    self.player.shouldAutoplay = YES; //開啟自動播放(player準(zhǔn)后后,自動播放)
    [self.view addSubview:self.player.view];// 添加拉流預(yù)覽視圖
    [self.player prepareToPlay];

3.5 添加觀察者比勉,監(jiān)聽拉流狀態(tài)

    //監(jiān)聽網(wǎng)絡(luò)狀態(tài)改變
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadStateDidChange:) name:IJKMPMoviePlayerLoadStateDidChangeNotification object:self.player];
    //監(jiān)聽播放網(wǎng)絡(luò)狀態(tài)改變
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playStateDidChange:) name:IJKMPMoviePlayerPlaybackStateDidChangeNotification object:self.player];
//網(wǎng)絡(luò)狀態(tài)改變通知響應(yīng)
- (void)loadStateDidChange:(NSNotification *)notification{
    IJKMPMovieLoadState loadState = self.player.loadState;
    if ((loadState & IJKMPMovieLoadStatePlaythroughOK) != 0) {
        NSLog(@"LoadStateDidChange: 可以開始播放的狀態(tài): %d\n",(int)loadState);
    }else if ((loadState & IJKMPMovieLoadStateStalled) != 0) {
        NSLog(@"loadStateDidChange: IJKMPMovieLoadStateStalled: %d\n", (int)loadState);
    } else {
        NSLog(@"loadStateDidChange: ???: %d\n", (int)loadState);
    }
}
//播放狀態(tài)改變通知響應(yīng)
- (void)playStateDidChange:(NSNotification *)notification{
    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;
        }
    }
}

3.6 界面消失的時候劳较,關(guān)閉播放器
[self.player stop];
[self.player shutdown];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市浩聋,隨后出現(xiàn)的幾起案子观蜗,更是在濱河造成了極大的恐慌,老刑警劉巖衣洁,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墓捻,死亡現(xiàn)場離奇詭異,居然都是意外死亡坊夫,警方通過查閱死者的電腦和手機砖第,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門撤卢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梧兼,你說我怎么就攤上這事放吩。” “怎么了羽杰?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵渡紫,是天一觀的道長。 經(jīng)常有香客問我考赛,道長惕澎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任欲虚,我火速辦了婚禮集灌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘复哆。我一直安慰自己欣喧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布梯找。 她就那樣靜靜地躺著唆阿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锈锤。 梳的紋絲不亂的頭發(fā)上驯鳖,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音久免,去河邊找鬼浅辙。 笑死,一個胖子當(dāng)著我的面吹牛阎姥,可吹牛的內(nèi)容都是我干的记舆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼呼巴,長吁一口氣:“原來是場噩夢啊……” “哼泽腮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起衣赶,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诊赊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后府瞄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碧磅,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了续崖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敲街。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖严望,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逻恐,我是刑警寧澤像吻,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站复隆,受9級特大地震影響拨匆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挽拂,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一惭每、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亏栈,春花似錦台腥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闷游,卻和暖如春峻汉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脐往。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工休吠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人业簿。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓瘤礁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辖源。 傳聞我的和親對象是個殘疾皇子蔚携,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

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