h265player開發


h265player開發

https://github.com/goldvideo/h265player

簡介

隨着視頻編碼技術的發展,相比H.264, H.265同等畫質體積僅為一半、帶寬占用省一半、畫質更細膩等諸多優勢。 但Web瀏覽器還不支持H.265的解碼播放,因此基於Web Assembly(封裝FFmpeg)、JS解封裝、Canvas投影以及AudioContext實現Web端的H265播放。

支持主要瀏覽器及其版本如下:
Chrome(>57) Safari (>11) Firefox (>52)

本項目是一個公開的基礎可用版本,並不含有具體的業務代碼。業務可基於此項目進行具體業務實現。 

安裝與測試

下載源碼

#創建根目錄
* mkdir goldvideo
* cd goldvideo
# 下載h265player源碼, 創建h265player目錄
* git clone https://github.com/goldvideo/h265player.git
* cd h265player
# 安裝依賴
* npm install

工程打包

#以下打包命令任選一
* npm run dev    #運行開發環境
* npm run test   #運行測試環境
* npm run build  #打包正式環境
* rollup -c      #打包csj與esm版本

Nginx配置(或者其他Server)

server {
    listen       8000;
    location / {
        root   <path of goldvideo>/goldvideo;
        index  index.html index.htm;
        autoindex on;
    }
}

測試頁面

重啟nginx並訪問demo地址,就能看到播放器畫面,如果可以能正常播放視頻時就表示成功了。http://localhost:8000/h265player/demo/demo.html

如果遇到錯誤,請通過檢查路徑配置以及資源是否加載完成等。您也可以給我們留言反饋問題,我們將盡快回復。

以上就完成了基本安裝,想了解更多詳情,可以接着往下看。

安裝NPM包,參照example快速運行例子[可選]

#可以直接npm安裝構建后的文件,快速運行DEMO
* npm i goldvideo-player

具體參見 goldvideo example

源碼安裝解封裝庫demuxer[可選]

下載 demuxer 庫源碼 或者 從 npm 安裝 (https://www.npmjs.com/package/demuxer)

* cd goldvideo
* git clone https://github.com/goldvideo/demuxer.git
* cd demuxer
* npm install
# 打包模塊,詳情請查看demuxer項目里面的package.json文件
* npm install --global rollup
# 構建demuxer模塊
* rollup -c ./rollup.config.js --environment BUILD_MODE:production
* cd h265player
# 從本地安裝demuxer,調用本地構建的庫
* npm install ../demuxer

源碼編譯WASM解碼庫[可選]

decoder_wasm庫之前已經編譯並復制到 h265player/dist/lib/目錄下。你也可以自己編譯並替換libffmpeg.js與libffmpeg.wasm文件。

#如果想看源碼和編譯過程,可以查看decoder_wasm模塊源碼。
* cd goldvideo
* git clone http://github.com/goldvideo/decoder_wasm.git
* cd decoder_wasm

wasm安裝略微復雜,詳細查看README文件

主要模塊結構

源碼目錄結構

├─goldvideo
│  ├─demuxer
│  ├─h265player
│  ├─decoder_wasm
│  ├─example

整體架構圖

 播放器主要分為UI、Loader、數據處理、數據渲染四個部分和3個線程。一個是主線程,包括界面控制、下載控制、數據流控制、音視頻控制等功能;數據加載線程,完成元數據和數據片段的請求;數據處理線程,完成數據解封裝和解碼。

  • UI:播放器顯示成,包括screen和controlbar兩部分,screen包括視頻圖像展示、彈窗、海報圖等。controlbar包括進度條、播放按鈕、音量控制等組件。
  • Loader:負責媒體數據的加載和解析,目前僅支持HLS協議。通過worker實現數據的請求,加載完成后,根據設置緩存大小,存儲請求的ts數據,當達到緩存上限后停止加載。解碼器從ts數據隊列獲取ts后,Hls Loader會把請求過的ts釋放,繼續加載下一個ts,達到最大緩存限制后停止加載
  • 數據處理:主要包括數據解封裝和H265解碼,解封裝通過demuxe.js這個類庫實現,H265解碼通過ffmpeg打包生成的wasm軟解來實現,cpu使用率較高。
  • 數據渲染:包括視屏渲染和音頻渲染,視頻渲染通過ImagePlayer把解碼后的yuv數據直接渲染到canvas,音頻通過AudioPlayer把AAC數據解碼后進行音頻播放,最后通過pts實現音視頻的同步。同步策略是以音頻為參考,判斷當前視頻pts與獲取到的音頻pts的差值來調整視頻顯示時間來達到音視頻同步。

具體流程如下:

解封裝器

通過JS實現了視頻數據的解封裝,從而獲取到獨立的視頻(H265)數據和音頻(AAC)數據。詳細信息請參考demuxer模塊:https://github.com/goldvideo/demuxer

解碼器

通過ffmpeg實現H265數據的軟解碼,如果要在瀏覽器中調用ffmpeg,需要把ffmpeg編譯成wasm進行調用,具體ffmpeg編譯成wasm過程,可參考decoder_wasm

ImagePlayer

 通過yuv-canvas實現YUV數據渲染,ImagePlayer中會有一個隊列存儲YUV數據,並計算當前yuv數據的時間長度,大於等於readybufferLength的值時,會觸發ImagePlayerReady事件。當音視頻播放器都處於ready狀態時,H265播放器觸發dataReady事件,開始調用play方法進行視頻播放。

AudioPlayer

Web Audio API

Audio Player的實現基於Web Audio API, 包括AAC音頻流的解碼與PCM數據的播放。  

  • 解碼:Audio Player模塊接收解封裝模塊發過來的AAC數據流,通過AudioContext的decodeAudioData API,解碼為待后續播放的PCM數據。
  • 音頻節點:音頻節點(AudioNode)是Web Audio API中的音頻數據"處理器",Web Audio API通過不同“處理器”對音頻數據做串行處理,最終通過揚聲器(audioContext.destination)播放。
    • ScriptProcessorNode:音頻源節點。Web Audio API提供多種音頻源節點以提供音頻數據,如AudioBufferSourceNode, MediaElementAudioSourceNode等。考慮到倍速播放的需求,我們用的是ScriptProcessorNode, 通過onaudioprocess回調函數請求音頻數據。
    • GainNode:音量控制節點。

倍速播放

Audio Context的部分音頻節點提供了playbackRate屬性以實現倍速播放的功能,但是音頻在倍速播放的同時,音頻的音調(pitch)也同步地升高/降低。
為實現變速不變調,項目中,我們使用了一個音頻數據處理庫SoundTouchJS,將處理過的變速不變調的音頻數據提供給ScriptProcessorNode。

快速開始

head標簽中添加如下代碼

<link rel="stylesheet" href="../dist/goldplay-h265.css">
<script src="../dist/goldplay-h265-sdk.js"></script>
<style>
    .play-container {
        width: 800px;
        height: 500px;
    }
</style>

創建一個div,作為播放器的容器

<div class="play-container"></div>

新建一個GoldPlay實例對象,傳入相應參數,就可以實現視頻的播放

//播放器容器
let el = doc.querySelector('.play-container')
//播放器參數
let options = {
    // 視頻播放地址
    sourceURL: 'http://localhost:8000/h265player/data/video2/playlist.m3u8',
    type: 'HLS'
    // wasm庫地址
    libPath: 'http://localhost:8000/h265player/dist/lib',
}
let player = new GoldPlay(el, options}

在線demo

https://omc3i.codesandbox.io/

組件擴展

如何擴展UI組件請參考文檔 組件添加componentadd

API

https://goldvideo.github.io/h265player/API/index.html

開發與維護

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM