如何快速的開發一個完整的iOS直播app(原理篇)

2021-02-24 iOS大全

(點擊上方公眾號,可快速關注)

來源:崢吖(@吖了個崢)   

www.jianshu.com/p/bd42bacbe4cc

如有好文章投稿,請點擊 → 這裡了解詳情

前言

大半年沒寫博客了,但我一直關注著網際網路的動向,最近會研究很多東西,並分享,今年移動直播行業的興起,誕生了一大批網紅,甚至明星也開始直播了,因此不得不跟上時代的步伐,由於第一次接觸的原因,因此花了很多時間了解直播,整理了直播的原理,當前只是原理篇,後續會持續發布實戰篇,教你從零開始搭建一個完整的iOS直播app,希望能幫助到更多的人更快的了解直播。

一、個人見解(直播難與易)

直播難:個人認為要想把直播從零開始做出來,絕對是牛逼中的牛逼,大牛中的大牛,因為直播中運用到的技術難點非常之多,視頻/音頻處理,圖形處理,視頻/音頻壓縮,CDN分發,即時通訊等技術,每一個技術都夠你學幾年的。

直播易:已經有各個領域的大牛,封裝好了許多牛逼的框架,我們只需要用別人寫好的框架,就能快速的搭建一個直播app,也就是傳說中的站在大牛肩膀上編程。

二、了解直播

熱門直播產品

映客,鬥魚,熊貓,虎牙,花椒等等

直播效果圖

1.一個完整直播app功能(來自落影loyinglin分享)

1、聊天

私聊、聊天室、點亮、推送、黑名單等;

2、禮物

普通禮物、豪華禮物、紅包、排行榜、第三方充值、內購、禮物動態更新、提現等;

3、直播列表

關注、熱門、最新、分類直播用戶列表等;

4、自己直播

錄製、推流、解碼、播放、美顏、心跳、後臺切換、主播對管理員操作、管理員對用戶等;

5、房間邏輯

創建房間、進入房間、退出房間、關閉房間、切換房間、房間管理員設置、房間用戶列表等;

6、用戶邏輯

普通登陸、第三方登陸、註冊、搜索、修改個人信息、關注列表、粉絲列表、忘記密碼、查看個人信息、收入榜、關注和取關、檢索等;

7、觀看直播

聊天信息、滾屏彈幕、禮物顯示、加載界面等;

8、統計

APP業務統計、第三方統計等;

9、超管

禁播、隱藏、審核等;

2.一個完整直播app原理

直播原理:把主播錄製的視頻,推送到伺服器,在由伺服器分發給觀眾觀看。

直播環節:推流端(採集、美顏處理、編碼、推流)、服務端處理(轉碼、錄製、截圖、鑑黃)、播放器(拉流、解碼、渲染)、互動系統(聊天室、禮物系統、zan)

3.一個完整直播app實現流程

1.採集、2.濾鏡處理、3.編碼、4.推流、5.CDN分發、6.拉流、7.解碼、8.播放、9.聊天互動

4.一個完整直播app架構

5.一個完整直播app技術點

三、了解流媒體(直播需要用到流媒體)

流媒體開發:網絡層(socket或st)負責傳輸,協議層(rtmp或hls)負責網絡打包,封裝層(flv、ts)負責編解碼數據的封裝,編碼層(h.264和aac)負責圖像,音頻壓縮。

幀:每幀代表一幅靜止的圖像

GOP:(Group of Pictures)畫面組,一個GOP就是一組連續的畫面,每個畫面都是一幀,一個GOP就是很多幀的集合

碼率:圖片進行壓縮後每秒顯示的數據量。

幀率:每秒顯示的圖片數。影響畫面流暢度,與畫面流暢度成正比:幀率越大,畫面越流暢;幀率越小,畫面越有跳動感。

解析度:(矩形)圖片的長度和寬度,即圖片的尺寸

壓縮前的每秒數據量:幀率X解析度(單位應該是若干個字節)

壓縮比:壓縮前的每秒數據量/碼率 (對於同一個視頻源並採用同一種視頻編碼算法,則:壓縮比越高,畫面質量越差。)

視頻文件格式:文件的後綴,比如.wmv,.mov,.mp4,.mp3,.avi,

視頻封裝格式:一種儲存視頻信息的容器,流式封裝可以有TS、FLV等,索引式的封裝有MP4,MOV,AVI等,

主要作用:一個視頻文件往往會包含圖像和音頻,還有一些配置信息(如圖像和音頻的關聯,如何解碼它們等):這些內容需要按照一定的規則組織、封裝起來.

注意:會發現封裝格式跟文件格式一樣,因為一般視頻文件格式的後綴名即採用相應的視頻封裝格式的名稱,所以視頻文件格式就是視頻封裝格式。

視頻封裝格式和視頻壓縮編碼標準:就好像項目工程和程式語言,封裝格式就是一個項目的工程,視頻編碼方式就是程式語言,一個項目工程可以用不同語言開發。

四、直播基礎知識介紹:1.採集視頻、音頻

* 1.1 採集視頻、音頻編碼框架 *

* 1.2 視頻、音頻硬體設備 *

CCD:圖像傳感器: 用於圖像採集和處理的過程,把圖像轉換成電信號。

拾音器:聲音傳感器: 用於聲音採集和處理的過程,把聲音轉換成電信號。

音頻採樣數據:一般都是PCM格式

視頻採樣數據: 一般都是YUV,或RGB格式,採集到的原始音視頻的體積是非常大的,需要經過壓縮技術處理來提高傳輸效率

2.視頻處理(美顏,水印)

* 視頻處理框架 *

GPUImage : GPUImage是一個基於OpenGL ES的一個強大的圖像/視頻處理框架,封裝好了各種濾鏡同時也可以編寫自定義的濾鏡,其本身內置了多達120多種常見的濾鏡效果。

OpenGL:OpenGL(全寫Open Graphics Library)是個定義了一個跨程式語言、跨平臺的編程接口的規格,它用於三維圖象(二維的亦可)。OpenGL是個專業的圖形程序接口,是一個功能強大,調用方便的底層圖形庫。

OpenGL ES:OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三維圖形 API 的子集,針對手機、PDA和遊戲主機等嵌入式設備而設計。

3.視頻編碼解碼

* 3.1 視頻編碼框架 *

FFmpeg:是一個跨平臺的開源視頻框架,能實現如視頻編碼,解碼,轉碼,串流,播放等豐富的功能。其支持的視頻格式以及播放協議非常豐富,幾乎包含了所有音視頻編解碼、封裝格式以及播放協議。

-Libswresample:可以對音頻進行重採樣,rematrixing 以及轉換採樣格式等操 作。

-Libavcodec:提供了一個通用的編解碼框架,包含了許多視頻,音頻,字幕流 等編碼/解碼器。

-Libavformat:用於對視頻進行封裝/解封裝。

-Libavutil:包含一些共用的函數,如隨機數生成,數據結構,數學運算等。

-Libpostproc:用於進行視頻的一些後期處理。

-Libswscale:用於視頻圖像縮放,顏色空間轉換等。

-Libavfilter:提供濾鏡功能。

X264:把視頻原數據YUV編碼壓縮成H.264格式

VideoToolbox:蘋果自帶的視頻硬解碼和硬編碼API,但是在iOS8之後才開放。

AudioToolbox:蘋果自帶的音頻硬解碼和硬編碼API

* 3.2 視頻編碼技術 *

視頻壓縮編碼標準:對視頻進行壓縮(視頻編碼)或者解壓縮(視頻解碼)的編碼技術,比如MPEG,H.264,這些視頻編碼技術是壓縮編碼視頻的

MPEG:一種視頻壓縮方式,它採用了幀間壓縮,僅存儲連續幀之間有差別的地方 ,從而達到較大的壓縮比

H.264/AVC:一種視頻壓縮方式,採用事先預測和與MPEG中的P-B幀一樣的幀預測方法壓縮,它可以根據需要產生適合網絡情況傳輸的視頻流,還有更高的壓縮比,有更好的圖象質量

注意1:如果是從單個畫面清晰度比較,MPEG4有優勢;從動作連貫性上的清晰度,H.264有優勢

注意2:由於264的算法更加複雜,程序實現煩瑣,運行它需要更多的處理器和內存資源。因此,運行264對系統要求是比較高的。

注意3:由於264的實現更加靈活,它把一些實現留給了廠商自己去實現,雖然這樣給實現帶來了很多好處,但是不同產品之間互通成了很大的問題,造成了通過A公司的編碼器編出的數據,必須通過A公司的解碼器去解這樣尷尬的事情

H.265/HEVC:一種視頻壓縮方式,基於H.264,保留原來的某些技術,同時對一些相關的技術加以改進,以改善碼流、編碼質量、延時和算法複雜度之間的關係,達到最優化設置。

P幀:(差別幀)保留這一幀跟之前幀的差別,解碼時需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面。(P幀沒有完整畫面數據,只有與前一幀的畫面差別的數據)

B幀:(雙向差別幀)保留的是本幀與前後幀的差別,解碼B幀,不僅要取得之前的緩存畫面,還要解碼之後的畫面,通過前後畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,但是解碼時CPU會比較累

幀內(Intraframe)壓縮:當壓縮一幀圖像時,僅考慮本幀的數據而不考慮相鄰幀之間的冗餘信息,幀內一般採用有損壓縮算法

幀間(Interframe)壓縮:時間壓縮(Temporal compression),它通過比較時間軸上不同幀之間的數據進行壓縮。幀間壓縮一般是無損的

muxing(合成):將視頻流、音頻流甚至是字幕流封裝到一個文件中(容器格式(FLV,TS)),作為一個信號進行傳輸。

* 3.3 音頻編碼技術 *

* 3.4碼率控制 *

* 3.5 視頻封裝格式 *

TS : 一種流媒體封裝格式,流媒體封裝有一個好處,就是不需要加載索引再播放,大大減少了首次載入的延遲,如果片子比較長,mp4文件的索引相當大,影響用戶體驗

FLV: 一種流媒體封裝格式,由於它形成的文件極小、加載速度極快,使得網絡觀看視頻文件成為可能,因此FLV格式成為了當今主流視頻格式

4.推流

* 4.1 數據傳輸框架 *

librtmp:用來傳輸RTMP協議格式的數據

* 4.2 流媒體數據傳輸協議 *

5.流媒體伺服器

* 5.1常用伺服器 *

* 5.2數據分發 *

CDN:(Content Delivery Network),即內容分發網絡,將網站的內容發布到最接近用戶的網絡」邊緣」,使用戶可以就近取得所需的內容,解決 Internet網絡擁擠的狀況,提高用戶訪問網站的響應速度.

1.上傳流媒體數據到伺服器(源站)

2.源站存儲流媒體數據

3.客戶端播放流媒體,向CDN請求編碼後的流媒體數據

4.CDN的伺服器響應請求,若節點上沒有該流媒體數據存在,則向源站繼續請求流媒體數據;若節點上已經緩存了該視頻文件,則跳到第6步。

5.源站響應CDN的請求,將流媒體分發到相應的CDN節點上

6.CDN將流媒體數據發送到客戶端

CDN:代理伺服器,相當於一個中介。

CDN工作原理:比如請求流媒體數據

回源:當有用戶訪問某一個URL的時候,如果被解析到的那個CDN節點沒有緩存響應的內容,或者是緩存已經到期,就會回源站去獲取搜索。如果沒有人訪問,那麼CDN節點不會主動去源站拿.

帶寬:在固定的時間可傳輸的數據總量,

負載均衡: 由多臺伺服器以對稱的方式組成一個伺服器集合,每臺伺服器都具有等價的地位,都可以單獨對外提供服務而無須其他伺服器的輔助.

通過某種負載分擔技術,將外部發送來的請求均勻分配到對稱結構中的某一臺伺服器上,而接收到請求的伺服器獨立地回應客戶的請求。

均衡負載能夠平均分配客戶請求到伺服器列陣,籍此提供快速獲取重要數據,解決大量並發訪問服務問題。

這種群集技術可以用最少的投資獲得接近於大型主機的性能。

QoS(帶寬管理):限制每一個組群的帶寬,讓有限的帶寬發揮最大的效用

6.拉流

HLS:由Apple公司定義的用於實時流傳輸的協議,HLS基於HTTP協議實現,傳輸內容包括兩部分,一是M3U8描述文件,二是TS媒體文件。可實現流媒體的直播和點播,主要應用在iOS系統

HLS與RTMP對比:HLS主要是延時比較大,RTMP主要優勢在於延時低

HLS協議的小切片方式會生成大量的文件,存儲或處理這些文件會造成大量資源浪費

相比使用RTSP協議的好處在於,一旦切分完成,之後的分發過程完全不需要額外使用任何專門軟體,普通的網絡伺服器即可,大大降低了CDN邊緣伺服器的配置要求,可以使用任何現成的CDN,而一般伺服器很少支持RTSP。

HTTP-FLV:基於HTTP協議流式的傳輸媒體內容。

RTSP:實時流傳輸協議,定義了一對多應用程式如何有效地通過IP網絡傳送多媒體數據.

RTP:實時傳輸協議,RTP是建立在UDP協議上的,常與RTCP一起使用,其本身並沒有提供按時發送機制或其它服務質量(QoS)保證,它依賴於低層服務去實現這一過程。

RTCP:RTP的配套協議,主要功能是為RTP所提供的服務質量(QoS)提供反饋,收集相關媒體連接的統計信息,例如傳輸字節數,傳輸分組數,丟失分組數,單向和雙向網絡延遲等等。

7.解碼

* 7.1 解封裝 *

* 7.2 音頻編碼框架 *

* 7.3 解碼介紹 *

硬解碼:用GPU來解碼,減少CPU運算

軟解碼:用CPU來解碼

8.播放9.聊天互動

IM:(InstantMessaging)即時通訊:是一個實時通信系統,允許兩人或多人使用網絡實時的傳遞文字消息、文件、語音與視頻交流.

騰訊云:騰訊提供的即時通訊SDK,可作為直播的聊天室

融云:一個比較常用的即時通訊SDK,可作為直播的聊天室

五、如何快速的開發一個完整的iOS直播app
1、利用第三方直播SDK快速的開發

七牛雲:七牛直播雲是專為直播平臺打造的全球化直播流服務和一站式實現SDK端到端直播場景的企業級直播雲服務平臺.

*    熊貓TV,龍珠TV等直播平臺都是用的七牛雲

網易視頻云:基於專業的跨平臺視頻編解碼技術和大規模視頻內容分發網絡,提供穩定流暢、低延時、高並發的實時音視頻服務,可將視頻直播無縫對接到自身App.

2、第三方SDK公司為什麼要提供SDK給我們?

希望把我們的產品和它綁在一條船上,更加的依賴它。

技術生錢,幫養一大批牛B的程式設計師

3、直播功能:自研還是使用第三方直播SDK開發?

第三方SDK開發: 對於一個初創團隊來講,自研直播不管在技術門檻、CDN、帶寬上都是有很大的門檻的,而且需要耗費大量的時間才能做出成品,不利於拉投資。

自研:公司直播平臺大,從長遠看,自研可以節省成本,技術成面比直接用SDK可控多了。

4.第三方SDK好處

看完本文有收穫?請分享給更多人

關注「 iOS大全 」,提升iOS技能

相關焦點

  • 從零開始,如何搭建一個完整的iOS直播App
    由於第一次接觸的原因,因此花了很多時間了解直播,整理了直播的原理,教你從零開始搭建一個完整的iOS直播app,希望能幫助到更多的人更快地了解直播。▍直播難個人認為要想把直播從零開始做出來,絕對是牛逼中的牛逼,大牛中的大牛。
  • ZEGO教程:如何快速搭建一個完整的Android直播平臺
    本文來自即構SDK用戶whale的投稿,她是一位資深的Android開發工程師,向我們分享了基於即構SDK,快速搭建一個安卓直播平臺的過程。
  • APP上架 app在哪裡購買 還款app開發 導購app開發 ios上架軟體 android上架 android應用上架
    APP上架 app在哪裡購買 還款app開發 導購app開發 ios上架軟體 口碑app的用處 ios軟體上架 android上架
  • Flutter完整開發實戰詳解(二、 快速開發實戰篇)
    作為系列文章的第二篇,繼Flutter完整開發實戰詳解(一、Dart語言和Flutter基礎)之後,本篇將為你著重展示:如何搭建一個通用的Flutter App 常用功能腳手架,快速開發一個完整的 Flutter 應用。
  • Hybrid App (混合應用) 技術全解析 -- 方案原理篇
    一套好的 Hybrid架構方案 能讓 App 既能擁有極致的體驗和性能,同時也能擁有 Web技術 靈活的開發模式、跨平臺能力以及熱更新機制,想想是不是都雞凍不已。。😄。本系列文章是博主在這方面實踐的一個總結,包含了原理解析、方案選型與實現、實踐優化等方面。大家可以到 github (xd_tayde) 上和我進行討論哈!
  • 不懂技術,零基礎如何自學編程開發一個 App?(蘋果篇)
    這一篇聊如何零基礎做一個 iOS(蘋果手機系統)App,講的主要是技術。後面還會有安卓篇、鴻蒙篇、小程序篇、網站篇、腳本篇和後臺系統篇等,由於有些方向我自己不熟,所以我會找我的程式設計師朋友來助陣,敬請期待。只是做一個 App 出來,是要比找工作容易很多的。找工作會要求懂的全,要系統的學,只是做App的話,只需要把自己需要的功能實現出來就可以。
  • 如何利用Python開發App?
    說在前面的話python語言雖然很萬能,但用它來開發app還是顯得有點不對路,因此用python開發的app應當是作為編碼練習、或者自娛自樂所用,加上目前這方面的模塊還不是特別成熟,bug比較多,總而言之,勸君莫輕入。
  • 手機App開發教程——如何避免app開發誤區
  • 一個APP開發的完整流程,超實用
    其實,APP開發的流程並不複雜,接下來就帶大家一起看一下一個完整的APP開發流程包含哪些步驟。第一步、基本功能需求階段1、前期功能需求討論:在開發前,需要產品經理跟客戶充分溝通,首先要了解客戶開發的APP類型、平臺、功能以及產品設計的需求、時長、預算等等。可以先做出基本的思維導圖,只有了解客戶的詳細需求才能做出詳細的APP開發方案。
  • Hybrid App技術解析 -- 原理篇
    一套好的 Hybrid架構方案 能讓 App 既能擁有極致的體驗和性能,同時也能擁有 Web技術 靈活的開發模式、跨平臺能力以及熱更新機制,想想是不是都雞凍不已。。😄本系列文章是公司在這方面實踐的一個總結,包含了原理解析、方案選型與實現、實踐優化等方面。大家可以到github上和我進行討論哈!
  • TimLiu總結的iOS、mac開源項目及庫 — Edit
    是不可多得地學習 WatchKit 的示例式教程(1.如何創建一個簡單的交互式計數器;2.如何從手錶上控制iOS app;3.如何在WatchKit app和iOS app之間共享數據;4.如何創建一個擁有不同背景色的數字時鐘;5.展示不同的UI層;6.如何創建支持滑動手勢的應用程式。)。KYVoiceCurve - 類似Apple Watch中語音的聲音曲線動畫。
  • Xamarin跨平臺原生app開發工具,實際開發經驗分享
    外包開發服務的IT諮詢公司:http://xamarin.com/consulting-partners一、優點1、使用C#語言開發跨平臺app,原生編譯為安卓、ios、WinPhone應用,佔整體代碼量80%的業務邏輯層、數據層代碼可以跨平臺共享,UI層代碼根據不同平臺有本平臺的專用特性,如果使用新的Xamarin.Forms跨平臺通用UI層方案,則可以跨平臺共享99%
  • 如何製作開發一個手機APP或網站(一)
    今天要來聊聊如何製作開發App或網站。一樣,我覺得這種技術並不是「學校上個課就可以學到的東西」。  我覺得,開發App比開發網站簡易許多,怎麼說呢,以ios為例,前端頁面完全可以用「拉」的,把素材拖拉一下就可以配製出一個頁面。  拖拉即可完成  更是網絡上有一堆模板可以套,就跟PPT很像,可以將別人做好的PTT套用在自己的報告裡面。
  • 如何用Wowza Gocoder SDK Android版開發一個基本功能的直播APP?
    這篇文章介紹了如何用Wowza Gocoder SDK Android版開發一個基本功能的直播APP。
  • iOS開發如何提高
    閱讀博客在現在這個碎片化閱讀流行的年代,博客的風頭早已被微博蓋過。而我卻堅持寫作博客,並且大量地閱讀同行的iOS開發博客。博客的文章長度通常在3000字左右,許多iOS開發知識都至少需要這樣的篇幅才能完整地講解清楚。並且博客相對於書籍來說,並沒有較長的出版發行時間,所以閱讀博客對於獲取最新的iOS開發知識有著非常良好的效果。
  • 一款手機APP製作開發的完整流程是什麼呢?如何開發一個app項目
    一款手機APP製作開發的完整流程是什麼呢?
  • Android碼農如何一個星期轉為iOS碼農
    作為一個android客戶端開發,如果你不懂點ios開發,怎麼好意思說自己是客戶端開發呢,本文講解如何讓android開發碼農在一個星期上手IOS
  • 開發一個完整APP的過程,APICloud敏捷式開發流程
    作者:孫叫獸  來源:CSDN目錄:如何使用 ?編譯器推薦控制臺使用總結(重要)遇到問題怎麼辦?如何上架各大應用市場?進去之後就可以創建自己的應用(新手可以選擇一個「Web App」體驗),支持個人開發及企業開發(記得完成必要的認證),一套代碼適配安卓及iOS兩種作業系統。具體流程請看新手指南👆。有問題可以在論壇提問,社區比較活躍,裡面的版主比較好客:https://community.apicloud.com/bbs/forum.php?
  • uni-app開發完成APP總結
    web前端開發app 第一版已完成
  • H5 手機 App 開發入門:技術篇
    如果你熟悉 Java 語言,可以學習安卓開發;如果熟悉腳本語言(比如 Python 或 Ruby),可以學習 Swift 語言,進行 iOS 開發;如果像我一樣,比較熟悉 Web 網頁技術,那麼 H5 開發是最容易上手的。這個系列教程的第一篇,已經介紹過了手機 App 的種類[1]。