banner
cos

cos

愿热情永存,愿热爱不灭,愿生活无憾
github
tg_channel
bilibili

青訓營 |「Web多媒體入門」筆記

Web 多媒體歷史#

  • PC 時代:Flash 等播放插件,富客戶端。
  • 移動互聯網時代:Flash 等逐漸被淘汰,HTML5 出現了,但其支持視頻格式等有限
  • Media Source Extensions ,支持多種視頻格式等

基礎知識#

編碼格式#

圖像基本概念#

  • 圖像分辨率:用於確定組成一副圖像的像素數據,就是指在水平和垂直方向上圖像所具有的像素個數
  • 圖像深度:圖像深度是指存儲每個像素所需要的比特數。圖像深度決定了圖像的每個像素可能的顏色數,或可能的灰度級數。
    • 例如,彩色圖像每個像素用 R,G,B 三個分量表示,每個分量用 8 位像素深度為 24 位,可以表示的顏色數目為 2 的 24 次方,即 16777216 個;
    • 而一副單色圖像存儲每個像素需要 8bit,則圖像的像素深度為 8 位,最大灰度數目為 2 的 8 次方,即256個。
  • 圖像分辨率與圖像深度共同決定了圖像所佔的大小~

視頻基本概念#

  • 分辨率:每一幀的圖像分辨率
  • 幀率:視頻單位時間內包含的視頻幀的數量
  • 碼率:就是指視頻單位時間內傳輸數據量,一般我們用kbps來表示,即千位每秒
  • 分辨率、幀率與碼率共同決定視頻的大小

視頻幀的分類#

I 幀、P 幀、B 幀

I 幀(幀內編碼幀)自帶全部信息的獨立幀,獨立進行解碼,不依賴其他幀

P 幀(前向預測編碼幀)參考前面的 I 幀 或者 P 幀 才能進行編碼

B 幀(雙向預測編碼幀):依賴前面與後面的幀,本幀與前後幀的差別

1 -> 2 -> 3 ->.....

image.png

DTS(Decode Time Stamp)解碼時間戳:決定 bit 流什麼時候開始送入解碼器中進行解碼。

PTS(Presentation Time Stamp)顯示時間戳:決定解碼後的視頻幀什麼時候被顯示出來

在沒有 B 幀存在的情況下 DTS 的順序和 PTS 的順序應該是相同的

GOP(group of picture)#

兩個 I 幀 之間的間隔,通常在 2~4s

image.png

I 幀比較多的話,視頻就會比較大

為什麼要編碼?#

視頻分辨率:1920 × 1080

那麼視頻裡一張圖片大小:1920 × 1080× 24/8 = 6220800Byte (5.2M)

那麼幀率為 30FPS、時長 90 分鐘的這樣一個視頻,占用大小:933G太大了!

更別說更高的 60FPS 了……

編碼都壓縮掉了些什麼呢?

  • 首先是空間冗餘

image.png

  • 時間冗餘:↓只有球的位置發生了變化,其他的都沒有變化

image.png

  • 編碼冗餘:如圖的圖像,可以藍色用 1 白色用 0 來表示(因為只有這兩種顏色,艾特某哈夫曼編碼方式)

    image.png

  • 視覺冗餘

    image.png

編碼數據處理流程#

image.png

通過預測去除空間和時間冗餘 -> 變換 去除空間冗餘

  • 量化 去除視覺冗餘 :把視覺系統看不太到了的東西去掉
  • 熵編碼 去除編碼冗餘:出現頻率高的,編碼字符所需長度小

封裝格式#

上述視頻編碼存儲的只是單純的視頻信息

封裝格式:存儲音視頻、圖片或者字幕信息的一種容器

image.png

image.png

多媒體元素和擴展 API#

video & audio#

<video> 標籤用於在 HTML 或者 XHTML 文檔中嵌入媒體播放器,用於支持文檔內的視頻播放。

<!DOCTYPE html>
<html>
<body>
    <video src="./video.mp4" muted autoplay controls width=600 height=300></video>
    <video muted autoplay controls width=600 height=300>
        <source src="./video.mp4"></source>
    </video>
</body>
</html>

<audio> 元素用於在文檔中嵌入音頻內容。

<!DOCTYPE html> 
<html>
<body>
    <audio src="./auido.mp3" muted autoplay controls width=600 he ight=300></audio>
    <audio muted autoplay controls width=600 height=300>
    	<source src=" ./audio.mp3"></source>
    </audio>
</body>
</html>

HTMLMediaElement

方法描述
play()開始播放音 / 視頻(異步的
pause()暫停當前播放的音 / 視頻
load()重新加載音 / 視頻元素
canPlayType()檢測瀏覽器是否能播放指定的音 / 視頻類型
addTextTrack()向音視頻添加新的文本軌道
屬性描述
autoplay設置或返回是否在加載完成後自動播放視頻。
controls設置或返回音頻 / 視頻是否顯示控件(比如播放 / 暫停等)
currentTime設置或返回音頻 / 視頻中的當前播放位置(以秒計)
duration返回當前音頻 / 視頻的長度(以秒計)
src設置或返回音頻 / 視頻元素的當前來源
volume設置或返回音頻 / 視頻的音量
buffered返回表示音頻 / 視頻已緩衝部分的 TimeRanges 對象
playbackRate設置或返回音頻 / 視頻播放的速度
error返回表示音頻 / 視頻錯誤狀態的MediaError 對象
readyState返回音頻 / 視頻當前的就緒狀態
......
事件描述
loadedmetadata當瀏覽器已加載音頻 / 視頻的元數據時觸發
canplay當瀏覽器可以開始播放音頻 / 視頻時觸發
play當音頻 / 視頻已開始或不再暫停時觸發
playing當音頻 / 視頻在因緩衝而暫停或停止後已就緒時觸發
pause當音頻 / 視頻已暫停時觸發
timeupdate當目前的播放位置已更改時觸發
seeking當用戶開始移動 / 跳躍到音頻 / 視頻中的新位置時觸發
seeked當用戶已移動 / 跳躍到音頻 / 視頻中的新位置時觸發
waiting當視頻由於需要緩衝下一幀而停止時觸發
ended當目前的播放列表已結束時觸發
......

缺陷#

  • audio 與 video 不支持直接播放 hls、flv 等視頻格式
  • 視頻資源的請求和加載無法通過代碼控制,也就無法實現以下功能
    • 分段加載(節約流量)
    • 清晰度無縫切換
    • 精確預加載

MSE(拓展 API)#

媒體源擴展 API (Media Source Extensions)

  • 無插件在 web 端播放流媒體

  • 支持播放 hIs、flv、 mp4 等格式視頻

  • 可實現視頻分段加載、清晰度無縫切換、自適應碼率、精確預加載等

  • 主流瀏覽器基本支持,除了 IOS 的 Safari

image.png

  1. 創建 mediaSource 實例
  2. 創建指向 mediaSource 的 URL
  3. 監聽 sourceopen 事件
  4. 創建 sourceBuffer
  5. 向 sourceBuffer 中加入數據
  6. 監聽 updateend 事件

image.png

  • 播放器播放流程

image.png

流媒體協議#

image.png

HLS 全稱是 HTTP Live Streaming, 是由 Apple 公司提出的基於 HTTP 的媒體流傳輸協議,用於實時音視頻流的傳輸。目前 HLS 協議被廣泛的應用於視頻點播和直播領域。

應用場景#

image.png

  • 點播 / 直播 -> 視頻上傳 -> 視頻轉碼
  • 圖片 -> 支持一些新的圖片
  • 雲遊戲 -> 不必再下繁瑣的客戶端等,運行在遠端上,視頻流來回傳播(對延遲要求高)

總結感想#

本節課老師科普了 Web 多媒體技術的基本概念,如編碼格式、封裝格式、多媒體元素、流媒體協議等,並闡述了 Web 多媒體的多種應用場景

本文引用的大部分內容來自劉立國老師的課以及 MDN

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。