Android多媒體軟件開發入門(一)

PART 1

OTT 是“Over The Top”的縮寫,是指通過互聯網向用戶提供各種應用服務。這種應用和目前運營商所提供的通信業務不同,它僅利用運營商的網絡,而服務由運營商之外的第三方提供。目前,典型的OTT業務有互聯網電視業務,蘋果應用商店等。不少OTT服務商直接面向用戶提供服務和計費,使運營商淪爲單純的“傳輸管道”,根本無法觸及管道中傳輸的巨大價值。

 

YUV(一種顏色編碼方法),主要用於電視系統以及模擬視頻領域,分爲三個分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用於指定像素的顏色。由於亮度信息(Y)與色彩信息(UV)分離,沒有UV信息一樣可以顯示完整的圖像,只不過是黑白的,這樣的設計很好地解決了彩色電視機與黑白電視的兼容問題。由於YUV不像RGB那樣要求三個獨立的視頻信號同時傳輸,所以用YUV方式傳送佔用極少的帶寬。

YUV碼流的存儲格式與其採樣的方式密切相關,主流的採樣方式有三種,YUV4:4:4,YUV4:2:2,YUV4:2:0,根據採樣格式從碼流中還原每個像素點的YUV值,因爲只有正確地還原了每個像素點的YUV值,才能通過YUV與RGB的轉換公式提取出每個像素點的RGB值,然後顯示出來。

提取每個像素的YUV分量參照:

YUV 4:4:4採樣,每一個Y對應一組UV分量,每像素32位

YUV 4:2:2採樣,每兩個Y共用一組UV分量,每像素16位

YUV 4:2:0採樣,每四個Y共用一組UV分量,每像素16位

平常所講的YUV A:B:C的意思一般是指基於4個像素來講,其中Y採樣了A次,U採樣了B次,V採樣了C次.

 

RGB565 每個像素用16位表示,RGB分量分別使用5位、6位、5位

RGB555 每個像素用16位表示,RGB分量都使用5位(剩下1位不用)

RGB24  每個像素用24位表示,RGB分量各使用8位

RGB32  每個像素用32位表示,RGB分量各使用8位(剩下8位不用)

ARGB32 每個像素用32位表示,RGB分量各使用8位(剩下的8位用於表示Alpha通道值)

轉換過程

1.RGB2YUV

在做RGB信號到YUV信號的轉換時,一般是先轉換到YUV444格式,然後再將UV信號的分辨率降低,變成我們所需的格式。

2.YUV2RGB

在播放視頻或顯示圖像的時候,我們需要將YUV信號轉換爲RGB信號。這個步驟稱爲渲染(Rendering)。

在做YUV到RGB的轉換時,首先需要將縮水的UV信號的分辨率拉昇到與Y信號相同的分辨率,然後再轉換到RGB信號。

PART 2

1080p是一種視頻顯示格式,P意爲逐行掃描(Progressive scanning),與它對應的是I意爲隔行掃描(interlace scanning)

視頻壓縮中,每幀代表一幅靜止的圖像。而在實際壓縮時,會採取各種算法減少數據的容量,其中IPB就是最常見的。I幀是關鍵幀,屬於幀內壓縮。就是和AVI的壓縮是一樣的。 P是向前搜索的意思。B是雙向搜索。他們都是基於I幀來壓縮數據。I幀可以理解爲一幀畫面的完整保留;解碼時只需要本幀數據就可以完成(因爲包含完整畫面)P幀表示的是這一幀跟之前的一個關鍵幀(或P幀)的差別,解碼時需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面。(也就是差別幀,P幀沒有完整畫面數據,只有與前一幀的畫面差別的數據)

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

DTS(Decoding Time Stamp):即解碼時間戳,這個時間戳的意義在於告訴播放器該在什麼時候解碼這一幀的數據。PTS(Presentation Time Stamp):即顯示時間戳,這個時間戳用來告訴播放器該在什麼時候顯示這一幀的數據。需要注意的是:雖然 DTS、PTS 是用於指導播放端的行爲,但它們是在編碼的時候由編碼器生成的。當視頻流中沒有 B 幀時,通常 DTS 和 PTS 的順序是一致的。但如果有 B 幀時解碼順序和播放順序不一致了。比如一個視頻中,幀的顯示順序是:I B B P,現在我們需要在解碼 B 幀時知道 P 幀中信息,因此這幾幀在視頻流中的順序可能是:I P B B,DTS 告訴我們該按什麼順序解碼這幾幀圖像,PTS 告訴我們該按什麼順序顯示這幾幀圖像。

音頻沒有類似視頻中 B 幀,不需要雙向預測,所以音頻幀的 DTS、PTS 順序是一致的。

要實現音視頻同步,通常需要選擇一個參考時鐘,參考時鐘上的時間是線性遞增的,編碼音視頻流時依據參考時鐘上的時間給每幀數據打上時間戳。在播放時,讀取數據幀上的時間戳,同時參考當前參考時鐘上的時間來安排播放。這裏的說的時間戳就是我們前面說的 PTS。實踐中,我們可以選擇:同步視頻到音頻、同步音頻到視頻、同步音頻和視頻到外部時鐘。

 

PART 3

開放多媒體加速層(Open Media Acceleration,縮寫爲OpenMAX),一個不需要授權、跨平臺的軟件抽象層,以C語言實現的軟件接口,用來處理多媒體。OpenMAX是專門用於音視頻、圖像編解碼的。一個完整的多媒體設備包括設備硬件、設備驅動以及設備應用程序。與之對應的是OpenMAX的DL、IL、AL層,DL層定義了衆多的API,全方位包含了OpenMAX音頻、視頻以及圖像處理功能,這些功能可以由硅供應商(芯片原廠)實現並優化,然後編解碼廠商在此基礎上實現一些廣泛的編解碼功能。

IL層是作爲一個比較低層級的接口來服務於嵌入式設備的音視頻、圖像編解碼。它使得應用程序與多媒體框架可以以一種統一的方式與多媒體編解碼器對接,而編解碼器本身可以是硬件與軟件的任何組合形式,這樣編解碼器可以做到對用戶透明,用戶無需關注編解碼器的實現細節問題。

AL層爲多媒體中間件與應用層之間提供一個標準化的API接口,多媒體中間件提供能夠完成預期的API功能的服務。AL層爲多媒體接口(應用)提供跨平臺可移植性。

機頂盒中數據是如何流向的呢?機頂盒demux的流程:清流數據大致流向: TS流-->tuner -->demux-->Buffer-->app

TS流中的數據是前段經過編碼、複用、調製之後的數據,機頂盒通過tuner對TS流解調,demux解複用然後將數據送到buffer中,最後機頂盒通過讀取buffer獲得需要的數據。

MPEG-2支持隔行掃描和逐行掃描。在逐行掃描模式下,編碼的基本單元是幀。在隔行掃描模式下,基本編碼可以是幀,也可以是場(field)。

封裝格式就是把視頻數據和音頻數據打包成一個文件的規範。僅僅看文件的後綴,很難能看出具體使用了什麼視音頻編碼標準。總的來說,不同的封裝格式之間差距不大,各有優劣。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章