一、直播一些技術名詞
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];
}
三、直播實踐 (直播和觀看都不支持模擬器)
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推流:
下載視頻到桌面后,執行推流命令:
$ ffmpeg -re -i /Users/denglibing/Desktop/loginmovie.mp4 -vcodec libx264 -acodec aac -strict -2 -f flv rtmp://localhost:7160/denglibinglive/room
VLC便開始播放流媒體:
將項目中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.xcodeproj
、RtmpLivePushSDK
復制到文件夾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