iOS直播實用篇

極速蝸牛 8年前發布 | 11K 次閱讀 Nginx iOS開發 移動開發

一.簡述總體內容

  • 1.直播流程介紹

  • 2. Mac 搭建 nginx+rtmp 服務器(模擬推流拉流)

  • 3.簡單的集成推流拉流( 實用篇 )

  • 4.好的博客推薦

二.直播流程介紹

  • 1.簡單的流程圖

    簡單的流程圖

  • 2.七牛的直播流程

    七牛的直播流程

  • 3.視頻直播,可以分為 采集 , 前處理(美顏等等) , 編碼 , 推流和傳輸 , 服務器處理 , 解碼拉流

    • 1. 采集 :采集是整個視頻推流過程中的第一個環節,它從系統的采集設備中獲取原始視頻數據,將其輸出到下一個環節。視頻的采集涉及兩方面數據的采集:音頻采集和圖像采集,它們分別對應兩種完全不同的輸入源和數據格式. iOS 系統因為軟硬件種類不多, 硬件適配性比較好, 所以比較簡單. 而 Android 端市面上機型眾多, 要做些機型的適配工作. PC 端是最麻煩的, 各種奇葩攝像頭驅動.所以現在很多的中小型直播平臺, 都放棄了 PC 的直播, 更有一些直播平臺只做 iOS 端的視頻直播.

    </li> </ul>

    采集

    • 2. 前處理 : 美顏算法,視頻的模糊效果, 水印等都是在這個環節做. 目前iOS端最著名開源框架的毫無疑問就是GPUImage.其中內置了125種渲染效果, 還支持各種腳本自定義. GPUImage所有濾鏡介紹 都說「80% 的主播沒有美顏根本沒法看」,美顏是直播產品中最常見的功能之一。最近準備在香港上市的美圖公司的主打產品就是美顏相機和美拍,有媒體戲稱其會沖擊化妝品行業,其實就是美顏的效果的功勞,讓美女主播們不化妝也可以自信的直播,而美顏相機的用戶則可以拍出「更好的自己」。

       

      前處理

    • 3. 編碼 :對流媒體傳輸來說,編碼也非常重要,它的編碼性能、編碼速度和編碼壓縮比會直接影響整個流媒體傳輸的用戶體驗和傳輸成本.重難點在于要在分辨率,幀率,碼率,GOP等參數設計上找到最佳平衡點。iOS8之后, Apple開放了VideoToolbox.framework, 可以直接進行硬編解碼, 這也是為什么現在大多數直播平臺最低只支持到iOS8的原因之一. iOS端硬件兼容性比較好, 可以直接采取硬編碼,常用的編碼有: H265

    • 4.推流和傳輸: 這塊一般都是交給CDN服務商. CDN只提供帶寬和服務器之間的傳輸, 發送端和接收端的網絡連接抖動緩存還是要自己實現的.目前國內最大的CDN服務商應該是網宿.傳輸協議一般是RTMP,HLS,FLV

    • 5.服務器處理:需要在服務器做一些流處理工作, 讓推送上來的流適配各個平臺各種不同的協議, 比如:RTMP,HLS,FLV...

    • 6.解碼拉流:推流需要編碼,同樣拉流解碼是必須的. iOS 端兼容較好, Android 依然大坑.這塊的難點在于音畫同步, 目前很多直播平臺這塊是硬傷.國內比較好的開源項目應該是B站開源的 ijkplayer .斗魚就是基于 ijkplayer 的, 本項目也是基于 ijkplayer 的.

    三.Mac搭建nginx+rtmp服務器(模擬推流拉流)

    效果如下(把桌面的視頻推到搭建的服務器再利用播放器 VLC 密碼: 7gbp 拉流),也可以用自己寫的播放軟件來拉流,或者三方

    Mac搭建nginx+rtmp服務器(模擬推流拉流)

    手動輸入命令的時候容易出現了bug(所以, 建議大家直接復制命令, 不要手動輸入命令). 

    • 1.打開終端, 查看是否已經安裝了 Homebrew , 直接終端輸入命令

      man brew

      如果Mac已經安裝了, 會顯示一些命令的幫助信息. 此時輸入Q退出即可, 直接進入第二步.反之, 如果沒有安裝,執行命令

      ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

      如果安裝后, 想要卸載

      ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"

    2.安裝nginx

    先clone nginx項目到本地

    brew tap homebrew/nginx

    執行安裝:

    brew install nginx-full --with-rtmp-module

    此時, nginx和rtmp模塊就安裝好了

    輸入命令:

    nginx

    在瀏覽器里打開 http://localhost:8080

    如果出現下圖, 則表示安裝成功

    安裝成功

    如果終端上提示

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

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

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

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

    .....

    則表示 8080 端口被占用了, 查看端口PID

    lsof -i tcp:8080

    根據端口PID, kill掉(這兒的9603換成你自己8080端口的PID)

    kill 9603

    然后重新執行 nginx , 打開 http://localhost:8080 進行檢測是否 nginx 安裝成功

    • 3.配置nginx和ramp

      首先我們查看nginx安裝到哪了

      brew info nginx-full

      如圖, 找到nginx.conf文件所在位置

    nginx.conf文件所在位置

    通過 vim 或者點擊 Finder ->前往->前往文件夾->輸入 /usr/local/etc/nginx/nginx.conf ->用記事本工具(推薦 Sublime Text )打開nginx.conf.

    直接滾到最后一行, 在最后一個 } (即最后的空白處, 沒有任何 {} )后面添加

    # 在http節點后面加上rtmp配置:
      rtmp {
        server {
        listen 1935;
        application rtmplive {
            live on;
            record off;
          }
        }
     }

    記得保存 command+S

    然后重啟nginx(其中的1.10.1要換成你自己安裝的 nginx 版本號, 查看版本號用 nginx -v 命令即可)

    /usr/local/Cellar/nginx-full/1.10.1/bin/nginx -s reload
    • 4.安裝ffmpeg

      執行命令

      brew install ffmpeg

      安裝 ffmpeg 時間就要長一點了. 如果速度過慢, 建議KX上網. 不過也才 50 多 M 的東西, 耐心一點就好. 等待的時間里, 再安裝一個支持 rtmp 協議的視頻播放器 VLC 密碼: 7gbp

    • 5.進行推流

      (1).ffmpeg推流,用我桌面的一個動畫片為例,執行推流命令

    動畫片

    ffmpeg -re -i /Users/jinqianxiang/Desktop/BigBuck.m4v -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://localhost:1935/rtmplive/room

    提醒: /Users/jinqianxiang/Desktop/BigBuck.m4v是路徑,你可把視頻拖進終端,查看路徑

    將視頻推流到服務器后,打開 VLC ,然后 File->open network-> 輸入:

    rtmp://localhost:1935/rtmplive/room

    輸入拉流的url

    效果如下

    效果

    四.簡單的集成推流拉流(實用篇)

    • 1. 推流端 ,這里我才用的 開源的拉流框架,開源的iOS推流框架 LFLiveKit . 是用OC寫的, 很適合學習集成也非常簡單, 幾句代碼就OK了.

      采用cocopods導入即可

      pod 'LFLiveKit'

    提示: LFLiveKit 已經集成了 GPUImage , 如果項目中有集成 GPUImage , 需要將之前的移除掉. 且集成 LFLiveKit 需要關閉 Bitcode.

    集成 LFLiveKit 需要關閉 Bitcode.

    導入成功

    cocopods成功導入LFLiveKit

    在推流的控制器寫入下面的代碼

    導入推流框架 #import "LFLiveKit.h"

    • (LFLiveSession*)session { if (!_session) { _session = [[LFLiveSession alloc] initWithAudioConfiguration:[LFLiveAudioConfiguration defaultConfiguration] videoConfiguration:[LFLiveVideoConfiguration defaultConfiguration]]; _session.preView = self; _session.delegate = self; } return _session; }

    • (void)startLive { LFLiveStreamInfo *streamInfo = [LFLiveStreamInfo new]; streamInfo.url = @"your server rtmp url"; [self.session startLive:streamInfo]; }

    • (void)stopLive {

      [self.session stopLive];
      

      }

    //MARK: - CallBack:

    • (void)liveSession:(nullable LFLiveSession *)session liveStateDidChange: (LFLiveState)state;
    • (void)liveSession:(nullable LFLiveSession )session debugInfo:(nullable LFLiveDebug)debugInfo;
    • (void)liveSession:(nullable LFLiveSession*)session errorCode:(LFLiveSocketErrorCode)errorCode;</code></pre>

      到此推流就成功了,提示網絡一定要打來

      打開網絡

      • 2. 拉流端 主要是基于 ijkplayer 的. 最好是打包成framework.打包教程

        下載 ijkplayer打包好的靜態庫 密碼: mcjt

        導入庫:

      導入庫

      完成上述之后,運行不報錯,就說明你基本上成功了,在拉流的控制器里面輸入下面的代碼

      導入 #import <IJKMediaFramework/IJKMediaFramework.h>

      1.創建推流對象

      • (LFLiveSession*)session { if (!_session) { _session = [[LFLiveSession alloc] initWithAudioConfiguration:[LFLiveAudioConfiguration defaultConfiguration] videoConfiguration:[LFLiveVideoConfiguration defaultConfiguration]]; _session.delegate = self; } return _session; }</code></pre>

        2.在點擊開始直播的方法里面輸入

        NSLog(@"開始直播");

    // 判斷是否是模擬器 if ([[UIDevice deviceVersion] isEqualToString:@"iPhone Simulator"]) {

    [MBProgressHUD showError:@"請用真機進行測試, 此模塊不支持模擬器測試"];
    
    return;
    

    }

    // 判斷是否有攝像頭 if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){ [MBProgressHUD showError:@"您的設備沒有攝像頭或者相關的驅動, 不能進行直播"]; return; }

    // 判斷是否有攝像頭權限 AVAuthorizationStatus authorizationStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; if (authorizationStatus == AVAuthorizationStatusRestricted|| authorizationStatus == AVAuthorizationStatusDenied) { [MBProgressHUD showError:@"app需要訪問您的攝像頭。\n請啟用攝像頭-設置/隱私/攝像頭"];

    return;
    

    }

    // 開啟麥克風權限 AVAudioSession *audioSession = [AVAudioSession sharedInstance]; if ([audioSession respondsToSelector:@selector(requestRecordPermission:)]) { [audioSession performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) { if (granted) { return YES; } else { //[self showInfo:@"app需要訪問您的麥克風。\n請啟用麥克風-設置/隱私/麥克風"]; return NO; } }]; }

    LFLiveStreamInfo *streamInfo = [LFLiveStreamInfo new];

    streamInfo.url = kTRMPServe;

    [self.session startLive:streamInfo];</code></pre>

    相關的類demo里面都有 簡單的直播demo 密碼: w935

    屏幕快照 2016-11-09 上午12.27.36.png

    到此,推流和拉流就完成了,更多美顏等功能等等,就看更多的大神博客,下面推薦

     

     

    來自:http://www.jianshu.com/p/339041855364

     

 本文由用戶 極速蝸牛 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!