1. 程式人生 > >iOS之音視訊的理論和直播相關知識

iOS之音視訊的理論和直播相關知識

視訊實質:

純粹的視訊(不包括音訊)實質上就是一組幀圖片,經過視訊編碼成為視訊(video)檔案再把音訊(audio)檔案有些還有字幕檔案組裝在一起成為我們看到的視訊(movie)檔案。1秒內出現的圖片數就是幀率,圖片間隔越小畫面就越流暢,所以幀率越高效果就越好,需要的儲存空間也就越多。

視訊格式:

MP4、MOV、AVI、RMVB這些播放格式其實都是封裝格式,除了RMVB比較特殊外,其他格式內封裝的視訊編碼格式都是H264,H264以高壓縮率聞名於世,壓縮效率比MEPG-2提升一倍多,但是世上沒有兩全其美的事,H264的解碼難度提高了3倍多。

視訊位元速率:

視訊檔案的大小除以是視訊的時長定義為位元速率。

位元速率和解析度跟視訊質量的關係:

  • 位元速率可以理解為取樣率,單位時間內取樣率越大,精度就越高,同時體積也越大。
  • 當視訊沒有經過編碼時,如果解析度越高,那麼視訊影象的細節越清晰。
  • 但如果視訊經過編碼,被限制在一定位元速率內,編碼器就必須捨棄掉一部分細節。
  • 所以解析度和位元速率都同清晰度有關。

流媒體協議介紹

HTTP漸進下載流媒體播放:  基於TCP。

所謂流媒體是指採用流式傳輸的方式在 Internet 播放的媒體格式。
流媒體又叫流式媒體,它是指商家用一個視訊傳送伺服器把節目當成資料包發出,傳送到網路上。
使用者通過解壓裝置對這些資料進行解壓後,節目就會像傳送前那樣顯示出來。
流媒體以流的方式在網路中傳輸音訊、視訊和多媒體檔案的形式。
流媒體檔案格式是支援採用流式傳輸及播放的媒體格式。
流式傳輸方式是將視訊和音訊等多媒體檔案經過特殊的壓縮方式分成一個個壓縮包,
由伺服器向用戶計算機連續、實時傳送。在採用流式傳輸方式的系統中,使用者不必像非流式播放那樣等到整個檔案
全部下載完畢後才能看到當中的內容,而是隻需要經過幾秒鐘或幾十秒的啟動延時即可在使用者計算機上利用
相應的播放器對壓縮的視訊或音訊等流式媒體檔案進行播放,剩餘的部分將繼續進行下載,直至播放完畢。
 

1. 偽流媒體:

  • 漸進式下載 : 邊下邊存, 檔案會儲存
  • 使用http協議,也能夠實現視訊播放, 也能快進快退等, 體驗上跟流媒體很像. 優酷, 土豆.這些網址就在使用這項技術.
  • 特點:實現簡單, 成本也低

    2 流媒體:

    邊下邊播, 不會儲存檔案,特點:流過就沒有了.常用的協議有兩個,分別為HLS (HTTP Live Streaming) 和 RTMP (Real Time Messaging Protocol)

  • HLS (HTTP Live Streaming),Apple的動態位元速率自適應技術。主要用於Mac和iOS音視訊服務。包括一個m3u(8)的索引檔案(.M3u8),多個TS媒體分片檔案(

    .ts)和key加密串檔案。支援推流和播放. iOS自帶的播放器就可以直接播放基於HLS協議的視訊,

     HTTP Live StreamingHLS)是蘋果公司(Apple Inc.)實現的基於HTTP的流媒體傳輸協議,可實現流媒體的直播和點播,主要應用在iOS系統,為iOS裝置(如iPhone、iPad)提供音視訊直播和點播方案。HLS點播,基本上就是常見的分段HTTP點播,不同在於,它的分段非常小。要實現HLS點播,重點在於對媒體檔案分段,目前有不少開源工具可以使用,這裡我就不再討論,只談HLS直播技術。

      相對於常見的流媒體直播協議,例如RTMP協議、RTSP協議、MMS協議等,HLS直播最大的不同在於,直播客戶端獲取到的,並不是一個完整的資料流。HLS協議在伺服器端將直播資料流儲存為連續的、很短時長的媒體檔案(MPEG-TS格式),而客戶端則不斷的下載並播放這些小檔案,因為伺服器端總是會將最新的直播資料生成新的小檔案,這樣客戶端只要不停的按順序播放從伺服器獲取到的檔案,就實現了直播。由此可見,基本上可以認為,HLS是以點播的技術方式來實現直播。由於資料通過HTTP協議傳輸,所以完全不用考慮防火牆或者代理的問題,而且分段檔案的時長很短,客戶端可以很快的選擇和切換位元速率,以適應不同頻寬條件下的播放。不過HLS的這種技術特點,決定了它的延遲一般總是會高於普通的流媒體直播協議。

      根據以上的瞭解要實現HTTP Live Streaming直播,需要研究並實現以下技術關鍵點

  • 採集視訊源和音訊源的資料
  • 對原始資料進行H264編碼和AAC編碼
  • 視訊和音訊資料封裝為MPEG-TS包
  • HLS分段生成策略及m3u8索引檔案
  • HTTP傳輸協議
  • RTMP是Real Time Messaging Protocol(實時訊息傳輸協議)的首字母縮寫。該協議基於TCP,是一個協議族,包括RTMP基本協議及RTMPT/RTMPS/RTMPE等多種 變種。RTMP是一種設計用來進行實時資料通訊的網路協議,主要用來在Flash/AIR平臺和支援RTMP協議的流媒體/互動伺服器之間進行音視訊和數 據通訊.

  • RTMP實時訊息傳送協議協議概述編輯
    RTMP(Real Time Messaging Protocol)實時訊息傳送協議是Adobe Systems公司為Flash播放器和伺服器之間音訊、視訊和資料傳輸 開發的開放協議。
    它有多種變種:
    1. RTMP工作在TCP之上,預設使用埠1935;
    2. RTMPE在RTMP的基礎上增加了加密功能;
    3. RTMPT封裝在HTTP請求之上,可穿透防火牆;
    4. RTMPS類似RTMPT,增加了TLS/SSL的安全功能;

RTP :(Real-time Transport Protocol)
是用於Internet上針對多媒體資料流的一種傳輸層協議.RTP 協議和 RTP 控制協議 RTCP 一起使用,
而且它是建立在 UDP 協議上的.
RTP 不像http和ftp可完整的下載整個影視檔案,它是以固定的資料率在網路上傳送資料,客戶端也是按照這種速度觀看影視檔案,當
影視畫面播放過後,就不可以再重複播放,除非重新向伺服器端要求資料。

RTCP:Real-time Transport Control Protocol 或 RTP Control Protocol或簡寫 RTCP)
實時傳輸控制協議,是實時傳輸協議(RTP)的一個姐妹協議.

注:--:RTP 協議和 RTP控制協議(RTCP) 一起使用,而且它是建立在UDP協議上的

RTSP:(Real Time Streaming Protocol)

實時流媒體會話協議,SDP(會話描述協議),RTP(實時傳輸協議)。
是用來控制聲音或影像的多媒體串流協議,RTSP 提供了一個可擴充套件框架,使實時資料,如音訊與視訊的受控、點播成為可能。
媒體資料使用rtp,rtcp協議。
一般使用udp 作為傳輸層。適合IPTV場景。
資料來源包括現場資料與儲存在剪輯中的資料。該協議目的在於控制多個數據傳送連線,為選擇傳送通道,如UDP、多播UDP與TCP提供途
徑,併為選擇基於RTP上傳送機制提供方法
傳輸時所用的網路通訊協定並不在其定義的範圍內,伺服器端可以自行選擇使用TCP或UDP來傳送串流內容,比較能容忍網路延遲.


--->:RTSP 與 RTP 最大的區別在於:RTSP 是一種雙向實時資料傳輸協議,它允許客戶端向伺服器端傳送請求,如回放、快進、倒退等操作。當
然,RTSP 可基於 RTP 來傳送資料,還可以選擇 TCP、UDP、組播 UDP 等通道來發送資料,具有很好的擴充套件性。它時一種類似與http協議
的網路應用層協議.

WebRTC:

web端實現流媒體的協議。google剛推出WebRTC的時候巨頭們要麼冷眼旁觀,要麼抵觸情緒很大。使用RTP協議傳輸。
 

***視訊播放原理:

  • 通過流媒體協議如RTSP+RTP、HTTP、MMS等下載的資料通過解協議獲得封裝格式資料,何為封裝格式的資料。如AVI、MP4、FLV等;
  • 對於封裝格式的資料進行解封裝,提取視訊流、音訊流、字幕流進行分離待下一步準備處理,
  • 分離後獲得音視訊檔案編碼檔案(音視訊檔案過大需要進行壓縮排行傳輸,即編碼),常見的編碼如H.264編碼的視訊碼流和AAC編碼的音訊碼流。壓縮編碼的視訊資料輸出成為非壓縮的顏色資料,例如YUV420P,RGB等等;壓縮編碼的音訊資料輸出成為非壓縮的音訊抽樣資料,例如PCM資料。
  • 視音訊同步,視訊流、音訊流、字幕流等進行同步播放。

解協議的作用,就是將流媒體協議的資料,解析為標準的相應的封裝格式資料。視音訊在網路上傳播的時候,常常採用各種流媒體協議,例如HTTP,RTMP,或是MMS等等。這些協議在傳輸視音訊資料的同時,也會傳輸一些信令資料。這些信令資料包括對播放的控制(播放,暫停,停止),或者對網路狀態的描述等。解協議的過程中會去除掉信令資料而只保留視音訊資料。例如,採用RTMP協議傳輸的資料,經過解協議操作後,輸出FLV格式的資料。

解封裝的作用,就是將輸入的封裝格式的資料,分離成為音訊流壓縮編碼資料和視訊流壓縮編碼資料。封裝格式種類很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是將已經壓縮編碼的視訊資料和音訊資料按照一定的格式放到一起。例如,FLV格式的資料,經過解封裝操作後,輸出H.264編碼的視訊碼流和AAC編碼的音訊碼流。

解碼的作用,就是將視訊/音訊壓縮編碼資料,解碼成為非壓縮的視訊/音訊原始資料。音訊的壓縮編碼標準包含AAC,MP3,AC-3等等,視訊的壓縮編碼標準則包含H.264,MPEG2,VC-1等等。解碼是整個系統中最重要也是最複雜的一個環節。通過解碼,壓縮編碼的視訊資料輸出成為非壓縮的顏色資料,例如YUV420P,RGB等等;壓縮編碼的音訊資料輸出成為非壓縮的音訊抽樣資料,例如PCM資料。

視音訊同步的作用,就是根據解封裝模組處理過程中獲取到的引數資訊,同步解碼出來的視訊和音訊資料,並將視訊音訊資料送至系統的顯示卡和音效卡播放出來。
-

***推流:

推流協議:一般點播採用HTTP ,而直播的話,大部分還是採用RTMP或者私有協議,原因是延時會比較小,RTMP本身也是為了直播設計的

封裝格式

封裝格式(也叫容器)主要作用是把視訊碼流和音訊碼流按照一定的格式儲存在一個檔案中。

常見格式

AVI:微軟在90年代初創立的封裝標準,是當時為對抗quicktime格式(mov)而推出的,只能支援固定CBR恆定位元率編碼的聲音檔案。

FLV:針對於h.263家族的格式。

MKV:萬能封裝器,有良好的相容和跨平臺性、糾錯性,可帶 外掛字幕。

MOV:MOV是Quicktime封裝。

MP4:主要應用於mpeg4的封裝 。

RM/RMVB:Real Video,由RealNetworks開發的應用於rmvb和rm 。

TS/PS:PS封裝只能在HDDVD原版。

WMV:微軟推出的,作為市場競爭。

***直播:

iOS開發之iOS直播平臺有用的第三方資源共享:

1.  實時美顏參考網址:http://altitudelabs.com/blog/real-time-filter/

2. 直播測試地址:

      3.  HLS streaming工具下載,用於處理m3u8音、視訊源的HLS Streaming Tool Download

   4. 直播相關SDK

        2. 網易雲信直播SDK 好像是收費的,價格還不便宜,一般公司可能也不會用,不過可以嘗試看看,瞭解一下,有助於學習!

3. 暴風雲直播   http://www.baofengcloud.com/apisdk/sdk/live/iossdk.html

 4. 融雲直播     http://www.rongcloud.cn/live

        5. 騰訊直播SDK  https://www.qcloud.com/solution/video.html

   5. 直播相關開源庫

       1. BeautifyFaceDemo 基於GPUImage的圖片處理,做美顏方面可以參考一下

       2.   lf.swift 開源RTMP Swift版的,可以學習一下!好像作者是日本的,或者是在日本工作的,寫了不少日文!

       3.  PLPlayerKit 一個不依賴FFmpeg的播放器,支援RTMP

       4.  HLS-Demo   https://github.com/yangchao0033/HLS-Demo  HLS播放demo

       5. SmarterStreaming  https://github.com/daniulive/SmarterStreaming  直播SDK(支援私有協議和RTMP推流,如windows推流/android推流/iOS推流/windows播放器/android播放器/iOS播放器)

視訊直播,是對視訊源的實時的觀看,不能快進等操作,注重實時性,對網路延遲要求比較高,相對於視訊的廣播

視訊點播,是對以往的視訊源進行回放,可以執行快進後退等操作

流程:音視訊取樣--》視訊濾鏡--》音視訊編碼--》推流--》流媒體伺服器--》客戶端拉流--》音視訊解碼--》視訊播放

我們的眼睛可能只需要1秒有30副畫面就會認為是一個連續的畫面了 而耳朵需要更高 需要多高呢 我們目前比較流行的CD格式就是44.1kHZ 這裡就是表示 1秒鐘記錄 44.1k次 也就44100次聲音訊號 基本達到這樣的水平 大部分人就覺得沒什麼區別了,但是其實和真實的聲音還是有區別的。

位元速率:FPS(每秒鐘要多少幀畫面);   以及Gop(表示多少秒一個I幀)。算一個PCM音訊流的位元速率是一件很輕鬆的事情,取樣率值×取樣大小值×聲道數 bps。一個取樣率為44.1KHz,取樣大小為16bit,雙聲道的PCM編碼的WAV檔案,它的資料速率則為 44.1K×16×2 =1411.2 Kbps

解析度:單位英寸中所包含的畫素點數; VGA:Video Graphics Array(視訊影象解析度)

幀率:編碼器每秒編出的資料大小,單位是kbps,比如800kbps代表編碼器每秒產生800kb(或100KB)的資料。

***點播:可以暫停,可以前進倒退。

***編碼、解碼:視訊壓縮演算法是通過去除時間、空間的冗餘來實現的。通過去除不同型別的冗餘,可以明顯的壓縮資料,代價就是一部分資訊失真,可以通過熵編碼器(如哈夫曼編碼等)進行編碼可以獲得更高的壓縮比。目前主流的影象/視訊壓縮標準為:JPEG,MPEG,H26X等標準。

視訊編碼就是為了壓縮視訊資料流。壓縮包括編碼器和解碼器兩部分,在傳輸或者儲存之前,編碼器將原始檔轉換成壓縮格式,在讀取或播放資料時,解碼器將壓縮資料恢復成視訊影象。編碼器和解碼器合稱為編解碼器(CODEC)。視訊資料的壓縮基本原理就是消除冗餘,而冗餘基本上是時間冗餘和空間冗餘。視訊編碼器一般分為三個主要功能單元:時域模型,頻域模型和熵編碼器。

時域模型的輸入是未壓縮的視訊流,通常原始視訊流的相鄰幀之間具有較大的相似性,採用當前幀之前或之後的一幀或多幀影象作為參考,採用運動補償技術來降低預測幀與當前幀之間的差別。時域模型輸出的是當前幀與預測幀相減的結果和各個模型引數。

頻域模型輸入的是殘差影象,它利用相鄰畫素點的相似性,消除殘差影象的頻域冗餘。編碼器對殘差影象進行頻域變換,再量化,得到相應的係數。變換系數經過量化後,保留了少量的殘差係數,它們構成了殘差影象的壓縮性描述,並作為頻域模型的最後輸出。

熵編碼器對時域引數(時域模型)和變換系數(頻域模型)進行壓縮,消除存在的統計冗餘,並輸出壓縮後的壓縮位元流或資料用於視訊的傳輸和儲存。壓縮後的視訊序列包括編碼的運動向量、變換系數以及頭資訊。

視訊編碼的核心技術是基於分塊的運動補償、殘差變換和量化方案。 

視訊編碼的主要作用是將視訊畫素資料(RGB,YUV等)壓縮成為視訊碼流,從而降低視訊的資料量。如果視訊不經過壓縮編碼的話,體積通常是非常大的,

因為不進行編碼的視訊資料量非常大,會造成儲存和傳輸上的困難,所以視訊檔案都需要在錄製完成後進行編碼。視訊編碼主要從兩個維度壓縮資料。

  • 1、單張影象某一區域相鄰畫素相似,比如一片紅色只記錄紅色色值和區域,不用記錄這個區域的每一個畫素點。
  • 2、相鄰影象之間內容相似,因為相鄰兩幀要製造連續的效果,所以兩幀之間的內容一般非常接近。目前主流的視訊編碼技術都是用影象編碼方法對第一幀進行編碼,然後用某種方式描述接下來的幀相對於附近的幀有什麼區別。

音訊處理要考慮的幾個方面引數:

軟解碼和硬解碼:

對H264的視訊解碼給CPU造成了很大負擔,所以手機工程師把這部分工作交給了更善於進行處理簡單工作但是資料量較大的GPU。

  • GPU解碼就是所謂的硬解碼
  • CPU解碼就是軟解碼。
  • iOS提供的播放器類使用的是硬解碼,所以視訊播放對CPU不會有很大的壓力,但是支援的播放格式比較單一,一般就是MP4、MOV、M4V這幾個。

***框架:ijkplayer是B站對開源框架FFmpeg(一個基於C的軟解碼視訊播放開源框架)的封裝;

http://blog.csdn.net/beitiandijun/article/details/8280448  FFmpeg的基本概念

多媒體視訊處理工具FFmpeg有非常強大的功能包括視訊採集功能、視訊格式轉換、視訊抓圖、給視訊加水印等。

****音軌合併:

****音視訊合併:

************直播的關鍵流程: