日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

h265webplayer

發布時間:2023/11/28 生活经验 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 h265webplayer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

h265webplayer

https://github.com/ksvc/h265webplayer

h265webplayer是金山云的Web端H.265視頻播放器,該播放器Web SDK讓您可以在支持WebAssembly的瀏覽器上播放MP4格式的點播視頻,FLV http-flv協議的直播視頻。

支持的功能

1、mp4格式的點播(音頻需是aac格式的,其余音頻格式待兼容)。

2、flv格式的直播。

兼容性

目前PC端和移動端都可以使用,使用前請使用播放器提供的isSupportH265接口檢查是否支持播放條件。

demo 有兩種訪問方式

mp4 demo 訪問方式

1、ks3直接訪問,鏈接如下:

https://ks3-cn-beijing.ksyun.com/ksplayer/h265/mp4_demo/index.html

flv demo 訪問方式

1、ks3直接訪問,鏈接如下:

https://ks3-cn-beijing.ksyun.com/ksplayer/h265/outside_demo/v1.1.3/index.html

2、獲取壓縮包后本地創建服務訪問,步驟如下:

播放器Demo壓縮包地址

flv demo zip

https://ks3-cn-beijing.ksyun.com/ai-kie/sdk/h265-pc/h265-pc.zip

播放器Demo運行說明

  1. 安裝npm包管理器

參見:Node.js官網

  1. 安裝http服務器

npm install http-server -g

  1. 啟動服務

cd

npm run start

瀏覽器訪問

http://localhost:8000

說明: 請替換頁面中的拉流地址進行測試

集成h265解碼器有兩種方式

1、直接使用金山自研的h265播放器(推薦) 2、基于H265Decoder開發使用

第一種方式:使用h265播放器

token的意義

用于鑒權,驗證用戶是否擁有訪問的權利以及訪問的時長

如何獲取token

先與商務溝通達成協議后,產品會根據需求提供一個對應的token

h265播放器初始化參數配置

let player = h265js.createPlayer({

    isLive: false,type: 'mp4'},{enableSkipFrame: false,          token: 'f8ce4d1adb97c46f28161a3685232557',  wasmFilePath: 'http://localhost:8000/libqydecoder.wasm',url: urlInput.value,timeToDecideWaiting: 50000,       bufferTime: 0,isShowStatistics: false     },{audioElement: audioElement,canvas: canvas,videoElement: h264VideoEle});

配置參數說明

播放器支持的方法

播放器支持的屬性

播放器支持的事件

獲取視頻編碼格式方法

player.on(h265js.Events.MEDIAINFO, function(event, data){

codec = data.codec;if (codec === 'avc1') {  

// h.264

    // 處理h.264視頻相關邏輯} else if (codec === 'hev1') { // h.265// 處理h.265視頻相關邏輯}

});

播放器控制條功能說明

<button class="ks-controls-load" onclick="load()">Load</button><button onclick="start()">Start</button><button onclick="pause()">Pause</button><button class="ks-controls-muted" onclick="muted()" data-type="muted">Muted</button><button onclick="fullscreen()">Fullscreen</button><input type="text" name="ks-seek-to" value="35"/><button onclick="seekto()">SeekTo</button><div class="ks-time"><span class="ks-current">00:00:00</span>/<span class="ks-duration">00:00:00</span></div>
![在這里插入圖片描述](https://img-blog.csdnimg.cn/202007131128460.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1amlhbmluZ18xMTAxMTc=,size_16,color_FFFFFF,t_70) 控制條功能具體實現邏輯可以參考demo

播放器能力監測

第二種方式:基于H265Decoder解碼器

JS接口說明

初始化

import H265Decoder from ‘/h265decoder.js’;

let config = {

wasmFilePath: 'http://localhost:8000/libqydecoder.wasm',enableSkipFrame: true

};

let decoder;

//加載并編譯wasm解碼庫

H265Decoder.compileWasmInterfaces(config.wasmFilePath, function () {

decoder = new H265Decoder(config);//設置解碼回調decoder.set_image_callback(onDecodedFrameCallback);

}

向解碼器隊列送數據

decoder.toBeDecodeQueue.push({

 nalu: new Uint8Array(naluData),  // naluData 為 ArrayBuffer類型數據pts: 0,  //展示時間戳isDroppable: false });  // 表示是否可以跳幀

decoder的toBeDecodeQueue屬性為保存待解碼數據的數組,需自行控制待解碼隊列緩沖區的長度,避免內存溢出
decoder會自動取出toBeDecodeQueue中的數據給底層wasm解碼器,并在解碼后自動釋放傳入wasm解碼器的待解碼數據

設置解碼輸出圖像回調
set_image_callback

decoder.set_image_callback((image) => {let w = image.get_width(); //獲取圖像寬度let h = image.get_height(); //獲取圖像高度let pts = image.get_pts();  //獲取圖像pts時間戳

// let image_data = new Uint8ClampedArray(w * h * 4);

    // for (let i = 0; i < w * h; i++) {//     image_data[i * 4 + 3] = 255;// }// //轉換image中的YUV數據到image_data中的RGB數據// image.transcode(image_data);//優化: 直接返回YUV數據let yuvData =  image.getYuvDataNew(); //Uint8Array});說明: 解碼回調函數的參數image為Image類型,參見h265decoder.js中的定義

其他接口

暫停解碼

decoder.pause();

恢復解碼

decoder.resume();

檢查是否為暫停狀態

if(decoder.isPaused()) {}

啟動解碼器

decoder.start();

說明: 默認情況初始化解碼器時會自動調用啟動解碼器

銷毀解碼器

decoder.free();

接收累積跳幀數通知

decoder.on('skip_frame, (skippedframecount) => {

console.log(skippedframecount);

});

wasm解碼器接口說明

接口函數返回碼說明

const qy265decoder = {

QY_OK : (0x00000000),          // SuccessQY_FAIL : (0x80000001),        //  Unspecified errorQY_OUTOFMEMORY : (0x80000002), //  Ran out of memoryQY_POINTER : (0x80000003),     //  Invalid pointerQY_NOTSUPPORTED : (0x80000004),//  Not support feature encoutneredQY_AUTH_INVALID : (0x80000005), //  authentication invalidQY_SEARCHING_ACCESS_POINT : (0x00000001), // in process of searching first access

point

QY_REF_PIC_NOT_FOUND : (0x80000007), // encode completeQY_NEED_MORE_DATA : (0x00000008),  // need more data QY_BITSTREAM_ERROR : (0x00000009), // detecting bitstream error, can be

ignored

QY_TOKEN_INVALID : (0x0000000A)    //token invalid

錯誤碼分為三大類狀態:

等于0: QY_OK,表示完全正常
大于0:雖然當前不能正常解碼,但解碼器本身并沒有出錯
小于0:解碼器本身發生了一些異常和錯誤

創建解碼器
QY265DecoderCreate

let returnCode = _malloc(4); //為返回碼分配空間

setValue(returnCode, 0, “i32”); // 返回碼設置為0

let decoder = qy265decoder.QY265DecoderCreate(null, token, returnCode);

if(getValue(returnCode, ‘i32’) === qy265decoder.QY_OK) { /解碼器創建成功/ }

銷毀編碼器
QY265DecoderDestroy

qy265decoder.QY265DecoderDestroy(decoder);

參數
![在這里插入圖片描述](https://img-blog.csdnimg.cn/20200713113115468.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1amlhbmluZ18xMTAxMTc=,size_16,color_FFFFFF,t_70

判斷解碼輸出幀是否有效
QY265DecoderGetFrameValid

let framevalid = qy265decoder.QY265DecoderGetFrameValid(frame);

參數

frame: QY265DecoderGetDecodedFrameEm接口返回的解碼輸出幀

返回值: 解碼輸出幀是否有效, 1為有效

歸還解碼輸出幀
QY265DecoderReturnDecodedFrame

通知解碼器釋放該幀占用的相關內存

qy265decoder.QY265DecoderReturnDecodedFrame(decoder, frame);

參數

decoder: 通過QY265DecoderCreate接口創建的解碼器實例
frame:QY265DecoderGetDecodedFrameEm接口返回的解碼輸出幀

獲取解碼輸出幀的寬度
QY265GetFrameWidth

let width = qy265decoder.QY265GetFrameWidth(frame, 0);

參數

frame:QY265DecoderGetDecodedFrameEm接口返回的解碼輸出幀

返回值: 解碼輸出幀的寬度

獲取解碼輸出幀的高度
QY265GetFrameHeight

let height = qy265decoder.QY265GetFrameHeight(frame, 0);

參數

frame:QY265DecoderGetDecodedFrameEm接口返回的解碼輸出幀

返回值: 解碼輸出幀的高度

獲取解碼輸出幀的顯示時間戳
QY265GetFramePts

let pts = qy265decoder.QY265GetFramePts(frame, 0);

參數

frame:QY265DecoderGetDecodedFrameEm接口返回的解碼輸出幀

返回值: 解碼輸出幀的顯示時間戳

獲取解碼輸出幀的YUV某個分量 QY265DecoderGetFramePlane

let stride = _malloc(2);let y = qy265decoder.QY265DecoderGetFramePlane(frame, 0, stride);let u = qy265decoder.QY265DecoderGetFramePlane(frame, 1, stride);let v = qy265decoder.QY265DecoderGetFramePlane(frame, 2, stride);

參數

frame:QY265DecoderGetDecodedFrameEm接口返回的解碼輸出幀
index: YUV分量索引,0表示Y分量,1表示U分量,2表示v分量

返回值: YUV某個數據分量的數組,格式為Uint8Array

Flush解碼器 QY265DecodeFlush

因為解碼NAL單元與獲取解碼輸出為異步關系, 所以解碼器中可能存在剩余尚未解碼完成的若干NAL單元. 調用本函數將使解碼器完成所有已經輸入的NAL單元的解碼. 一般在碼流結束或者播放器拖曳時使用.

qy265decoder.QY265DecodeFlush(decoder, bClearCachedPics, returnCode);

參數

decoder: 通過QY265DecoderCreate接口創建的解碼器實例bClearCachedPics: 是否清除緩沖的圖像. 在碼流結束時, 置為false, 不清除, 得到所有輸出幀;在播放器拖曳或其他情況下, 置為true, 清除之前的圖像幀, 重新開始returnCode: 返回碼,returnCode對應地址保存0(QY_OK)表示正常

YUV渲染器文檔

初始化YUV渲染器

import WebGLCanvas from ‘yuvrender.min.js’; // yuvrender.min.js在壓縮包中的demo目錄下

let webGLCanvas = new WebGLCanvas({

                canvas: this.canvas, //傳入一個canvaswidth: width,        //視頻幀寬度height: height       //視頻幀高度});

備注:視頻會根據它真實的寬高比自適應視頻容器canvas的寬高

渲染一幀YUV數據

// 假設yuvData為解碼輸出的一幀圖像的YUV表示(Uint8Array類型)

let ylen = width * height; //視頻寬高

let uvlen = (width / 2) * (height / 2);

webGLCanvas.drawNextOutputPicture({

yData: yuvData.subarray(0, ylen),uData: yuvData.subarray(ylen, ylen + uvlen),vData: yuvData.subarray(ylen + uvlen, ylen + uvlen*2)

});

獲取解碼輸出的圖像幀的YUV表示

參見: 設置解碼輸出圖像回調 set_image_callback

總結

以上是生活随笔為你收集整理的h265webplayer的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。