直播技術匯總


做一款仿映客的直播App?看我就夠了

直播時代--IOS直播客戶端SDK,美顏直播

直播技術匯總

一、直播一些技術名詞

1、什么是 FFmpeg ,FFmpeg 是一個開源免費跨平台的視頻和音頻流方案,屬於自由軟件,它提供了錄制、轉換以及流化音視頻的完整解決方案。直播系統多使用該方案。

2、什么是 RTMP(Real Time Messaging Protocol:實時消息傳輸協議)Adobe公司開發。一個專門為高效傳輸視頻,音頻和數據而設計的協議。它通過建立一個二進制TCP連接或者連接HTTP隧道實現實時的視頻和聲音傳輸。

 

二、直播整體技術實現

 

技術相對都比較成熟,設備也都支持硬編碼。iOS還提供現成的 Video ToolBox框架,可以對攝像頭和流媒體數據結構進行處理,但Video ToolBox框架只兼容8.0以上版本,8.0以下就需要用x264的庫軟編了。

github上有現成的開源實現,推流、美顏、水印、彈幕、點贊動畫、濾鏡、播放都有。技術其實不是很難,而且現在很多雲廠商都提供SDK,七牛雲、金山雲、樂視雲、騰訊雲、百度雲、斗魚直播伴侶推流端,功能幾乎都是一樣的,沒啥亮點,不同的是整個直播平台服務差異和接入的簡易性。后端現在 RTMP/HTTP-FLV 清一色,App掛個源站直接接入雲廠商或CDN就OK。

 

1、直播項目傳輸方式介紹

 

2、直播項目采集端(推送端)介紹

推流端可以選擇很多GitHub上的開源項目,比如VideoCore 、LiveVideoCoreSDK 、LFLiveKit 。商用的話可以選擇各大廠商的SDK,網易直播雲、七牛、騰訊、百度、新浪。使用直播雲的好處就是能快速上線App,功能十分齊全,可以播放器和推流端,服務器一套下來,有專業客服人員幫助集成到工程中,缺點就是流量費太貴了,具體可以了解下各大廠商的收費標准。

 

2.1.目前比較知名的有VideoCore

目前國內很多知名的推流框架都是對VideoCore的二次開發。這個框架主要使用C++寫的,支持RTMP推流,但對於iOS開發者來說有點晦澀難懂(精通C++的除外)。想開源和免費的可以選擇現在的幾個知名項目VideoCore + GPUImage+基於GPU的美顏濾鏡 ,播放用IJKPlayer自己修改。

 

2.2.國內比較火的LiveVideoCoreSDK

框架提供iOS蘋果手機的RTMP推流填寫RTMP服務地址,直接就可以進行推流,SDK下載后簡單的工程配置后能直接運行,實現了美顏直播和濾鏡功能,基於OpenGL,前后攝像頭隨時切換,提供RTMP連接狀態的回調。

這個框架是國內比較早的一款推流框架有不少在使用這個SDK,功能非常齊全,作者也比較牛,用來學習推流采集相關內容非常好,但是集成到工程中有些困難(對於我來說)。總的來說這是一款非常厲害的推流SDK,幾乎全部使用C++寫的,編譯效率非常好,如果有實力的話推薦使用這個框架來做自己項目的推流端。

 

2.3.可讀性比較好的推流LFLiveKit

框架支持RTMP、HlS (HTTP Live Streaming:蘋果自家的動態碼率自適應技術) 。主要用於PC和Apple終端的音視頻服務。包括一個m3u(8)的索引文件,TS媒體分片文件和key加密串文件。

推薦這個框架第一是因為它主要使用OC寫的,剩下的用C語言寫的,框架文件十分清晰,這對不精通C++的初學者提供了很大的便利,並且拓展性非常強,支持動態切換碼率功能,支持美顏功能。

 

2.4.美顏功能

美顏的話一般都是使用GPUImage 的基於OpenGl開發,純OC語言,這個框架十分強大,可以做出各種不同濾鏡,可拓展性高。如果對美顏沒有具體思路可以直接用BeautifyFace ,可以加入到項目中,很方便的實現美顏效果。

 

3、直播項目播放端介紹

播放端用的針對RTMP優化過的ijkplayer ,ijkplayer 是基於FFmpeg的跨平台播放器,這個開源項目已經被多個 App 使用,其中映客、美拍和斗魚使用了 ijkplayer(8000+⭐️) 。可以參考這篇博客獲取framework:iOS中集成ijkplayer視頻直播框架 。也可以直接下載別人已經集成好的framework:IJKMediaFramework.framework

播放方法:

 
- (void)goPlaying {
    //獲取url
    self.url = [NSURL URLWithString:_liveUrl];
    _player = [[IJKFFMoviePlayerController alloc] initWithContentURL:self.url withOptions:nil];
    UIView *playerview = [self.player view];
    UIView *displayView = [[UIView alloc] initWithFrame:self.view.bounds];
    self.PlayerView = displayView;
    [self.view addSubview:self.PlayerView];
    // 自動調整自己的寬度和高度
    playerview.frame = self.PlayerView.bounds;
    playerview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.PlayerView insertSubview:playerview atIndex:1];
    [_player setScalingMode:IJKMPMovieScalingModeAspectFill];
}

 

三、直播實踐 (直播和觀看都不支持模擬器)

基於LiveVideoCoreSDK完整項目源碼

1、搭建nginx+RTMP 服務器:Mac搭建nginx+rtmp服務器

i. 安裝nginx (網頁服務器,它能反向代理HTTP, HTTPS, SMTP, POP3, IMAP的協議鏈接,以及一個負載均衡器和一個HTTP緩存) :

 
## clone nginx項目到本地
$ brew tap homebrew/nginx
## 執行安裝
$ brew install nginx-full --with-rtmp-module
## 成功之后
$ nginx

在瀏覽器里打開http://localhost:8080 如果出現下圖, 則表示安裝成功

ii. 配置nginx和RTMP:

 
## 查看nginx安裝到哪了
$ brew info nginx-full
...
...
==> Caveats
Docroot is: /usr/local/var/www
The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.
nginx will load all files in /usr/local/etc/nginx/servers/.

找到nginx.conf 文件所在位置(/usr/local/etc/nginx/nginx.conf) , 點擊Finder ->前往 ->前往文件夾 ->輸入/usr/local/etc/nginx/nginx.conf -> 用記事本工具(推薦Sublime Text) 打開 nginx.conf。直接滾到最后一行, 在最后一個} (即最后的空白處, 沒有任何{})后面添加:

 
# 在http節點后面加上rtmp配置:
rtmp {
    server {
# 端口一般使用4位,本人開始使用三位,一直有問題,折騰了半天!
        listen 7160;
        application denglibinglive {
            live on;
            record off;
        }
    }
}

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

 
$ /usr/local/Cellar/nginx-full/1.10.1/bin/nginx -s reload

iii. 安裝FFmpeg:

 
$ brew install ffmpeg

iv. 下載能播放流媒體的播放器VLC

下載后安裝,打開 VLC,然后 File->open network(command+N)輸入:

 
rtmp://localhost:7160/denglibinglive/room

v.開始FFMpeg推流:

mp4視頻下載地址

下載視頻到桌面后,執行推流命令:

 
$ ffmpeg -re -i /Users/denglibing/Desktop/loginmovie.mp4 -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://localhost:7160/denglibinglive/room

VLC便開始播放流媒體:

 

2、下載基於LiveVideoCoreSDK完整項目源碼

將項目中ViewController.m 的viewDidLoad 中改為如下:

 
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    [self UIInit];
    
    _RtmpUrlTextField.text = @"rtmp://ossrs.net/live/123456";
    // 注意 192.168.1.20 是你電腦的ip地址即nginx服務器地址,7160/denglibinglive/room 是博客上面對應的參數,切勿搞錯了。
    _RtmpUrlTextField.text = @"rtmp://192.168.1.20:7160/denglibinglive/room";
}

iOS10 以上的手機需要在 info.plist 中加入直播所需要的權限:

 
    <key>NSCameraUsageDescription</key>
    <string>運行項目使用相機</string>
    <key>NSAppleMusicUsageDescription</key>
    <string>運行項目使用多媒體</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>運行項目使用麥克風</string>

運行即可直播!

 

3、直播項目采集端:從0到1開始集成LiveVideoCoreSDK

i. 在Desktop 新建文件夾HDLiveVideoCoreDemo 使用Xcode建立項目組(Workspace),命名為HDLiveVideoCoreDemo.xcworkspace 並保存在 HDLiveVideoCoreDemo 中:

 

ii、將基於LiveVideoCoreSDK完整項目源碼 源碼的LiveVideoCoreSDK 、LiveVideoCoreCoreSDK.xcodeprojRtmpLivePushSDK 復制到文件夾HDLiveVideoCoreDemo 中:

 

iii、打開HDLiveVideoCoreDemo.xcworkspace ,新建 LiveVideoCoreDemo.xcodeproj 項目:

 

iv、分別將LiveVideoCoreSDK.xcodeproj 和 RtmpLivePushSDK.xcodeproj 拖入到項目組中:

 

v、將libLiveVideoCoreSDK 加入到LiveVideoCoreDemo 項目中,並添加對應所需要的系統框架和tdb文件:

 
AVFoundation.framework
AudioToolbox.framework
CFNetwork.framework
CoreMedia.framework
OpenGLES.framework
VideoToolbox.framework
CoreVideo.framework
libz.tbd
libstdc++.tbd

 

vi、到此為止,LiveVideoCoreSDK 依賴的環境系統文件已經集成到新項目中,接下來對項目進行必要的配置:

因為LiveVideoCoreSDK 不支持Bitcode , 所以需要設置Enable Bitcode 為NO

因為LiveVideoCoreSDK.h 不在LiveVideoCoreDemo 項目中,所以需要 設置

Header Search Paths : ../LiveVideoCoreSDK/

../LiveVideoCoreSDK/ 這個是 LiveVideoCoreSDK.h 相對於LiveVideoCoreDemo.xcodeproj 的路徑。

 

vii、添加代碼運行。

 
- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    [[LiveVideoCoreSDK sharedinstance] LiveInit:[NSURL URLWithString:@"rtmp://192.168.1.20:7160/denglibinglive/room"]
                                        Preview:self.view
                                       VideSize:(CGSizeMake(540, 960))
                                        BitRate:LIVE_BITRATE_800Kbps
                                      FrameRate:LIVE_VIDEO_DEF_FRAMERATE
                                    highQuality:true];
    [LiveVideoCoreSDK sharedinstance].delegate = self;
    [[LiveVideoCoreSDK sharedinstance] connect];
    
    [LiveVideoCoreSDK sharedinstance].micGain = 5;
}
//rtmp status delegate:
- (void) LiveConnectionStatusChanged: (LIVE_VCSessionState) sessionState{
    NSLog(@"RTMP狀態 : %d", (int)sessionState);
}

LiveVideoCoreSDK 集成完畢!

Demo下載地址:HDLiveVideoCoreDemo

 

4、直播播放端:

播放端用的針對RTMP優化過的ijkplayer ,ijkplayer 是基於FFmpeg的跨平台播放器,這個開源項目已經被多個 App 使用,其中映客、美拍和斗魚使用了 ijkplayer(8000+⭐️) 。可以參考這篇博客獲取framework:iOS中集成ijkplayer視頻直播框架 。也可以直接下載別人已經集成好的framework:IJKMediaFramework.framework

集成也很簡單,新建項目,將下載的IJKMediaFramework.framework 加入到項目即可:

 
- (void)viewDidLoad {
    [super viewDidLoad];
    
    //rtmp://live.hkstv.hk.lxdns.com:1935/live/hks (流媒體數據)
    //rtmp://10.0.44.72:1935/denglibinglive/room (本地局域網的服務地址,局域網內測試直播和播放)
    //rtmp://115.28.135.68:1935/yuzhouheike/room (別人搭建好的雲主機服務地址,支持不在局域網的直播和播放)
    _moviePlayer = [[IJKFFMoviePlayerController alloc] initWithContentURLString:@"rtmp://115.28.135.68:1935/yuzhouheike/room" withOptions:nil];
    _moviePlayer.view.frame = self.view.bounds;
    // 填充fill
    _moviePlayer.scalingMode = IJKMPMovieScalingModeAspectFill;
    // 設置自動播放(必須設置為NO, 防止自動播放, 才能更好的控制直播的狀態)
    _moviePlayer.shouldAutoplay = NO;
    [self.view insertSubview:_moviePlayer.view atIndex:0];
    [_moviePlayer prepareToPlay];
    
    // 設置監聽
    [self initObserver];
}
- (void)initObserver{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stateDidChange) name:IJKMPMoviePlayerLoadStateDidChangeNotification object:self.moviePlayer];
}
- (void)stateDidChange{
    if ((self.moviePlayer.loadState & IJKMPMovieLoadStatePlaythroughOK) != 0) {
        if (!self.moviePlayer.isPlaying) {
            [self.moviePlayer play];
        }
    }
}

Demo下載地址:HDIJKMediaSDKDemo

from:http://blog.csdn.net/u012390519/article/details/52871859


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM