From 170ee55bd1f0858fdbad3147a72c0f185d49a9a6 Mon Sep 17 00:00:00 2001 From: zhangzengfei <zhangzengfei@smartai.com> Date: 星期四, 10 三月 2022 11:02:01 +0800 Subject: [PATCH] cameraPlayer 添加h265b播放功能 --- src/components/wasmPlayer/wasm/pcm-player.js | 412 +++++++++++++++++++++++++++------------------------------- 1 files changed, 189 insertions(+), 223 deletions(-) diff --git a/src/components/wasmPlayer/wasm/pcm-player.js b/src/components/wasmPlayer/wasm/pcm-player.js index 2e71f7f..663cf62 100644 --- a/src/components/wasmPlayer/wasm/pcm-player.js +++ b/src/components/wasmPlayer/wasm/pcm-player.js @@ -1,227 +1,193 @@ -export function PCMPlayer(option) -{ - this.init(option); +export function PCMPlayer(option) { + this.init(option) } -PCMPlayer.prototype.init=function(option) -{ - var defaults={ - encoding: '16bitInt', - channels:1, - sampleRate:8000, - flushingTime:1000 - }; - this.option=Object.assign({},defaults,option); - this.samples=new Float32Array(); - this.flush=this.flush.bind(this); - this.interval=setInterval(this.flush,this.option.flushingTime); - this.maxValue=this.getMaxValue(); - this.typedArray=this.getTypedArray(); - this.createContext(); -}; - -PCMPlayer.prototype.getMaxValue=function() -{ - var encodings={ - '8bitInt': 128, - '16bitInt':32768, - '32bitInt':2147483648, - '32bitFloat':1 - } - - return encodings[this.option.encoding]?encodings[this.option.encoding]:encodings['16bitInt']; -}; - -PCMPlayer.prototype.getTypedArray=function() -{ - var typedArrays={ - '8bitInt': Int8Array, - '16bitInt':Int16Array, - '32bitInt':Int32Array, - '32bitFloat':Float32Array - } - - return typedArrays[this.option.encoding]?typedArrays[this.option.encoding]:typedArrays['16bitInt']; -}; - -PCMPlayer.prototype.createContext=function() -{ - this.audioCtx=new (window.AudioContext||window.webkitAudioContext)(); - this.gainNode=this.audioCtx.createGain(); - this.gainNode.gain.value=1; - this.gainNode.connect(this.audioCtx.destination); - this.startTime=this.audioCtx.currentTime; -}; - -PCMPlayer.prototype.isTypedArray=function(data) -{ - return (data.byteLength&&data.buffer&&data.buffer.constructor==ArrayBuffer); -}; - -PCMPlayer.prototype.feed=function(data) -{ - if(!this.isTypedArray(data)) return; - data=this.getFormatedValue(data); - var tmp=new Float32Array(this.samples.length+data.length); - tmp.set(this.samples,0); - tmp.set(data,this.samples.length); - this.samples=tmp; -}; - -PCMPlayer.prototype.getFormatedValue=function(data) -{ - var data=new this.typedArray(data.buffer), - float32=new Float32Array(data.length), - i; - - for(i=0; i<data.length; i++) - { - float32[i]=data[i]/this.maxValue; - } - return float32; -}; - -PCMPlayer.prototype.volume=function(volume) -{ - this.gainNode.gain.value=volume; -}; - -PCMPlayer.prototype.destroy=function() -{ - if(this.interval) - { - clearInterval(this.interval); - } - this.samples=null; - this.audioCtx.close(); - this.audioCtx=null; -}; - -PCMPlayer.prototype.flush=function() -{ - if(!this.samples.length) return; - var bufferSource=this.audioCtx.createBufferSource(), - length=this.samples.length/this.option.channels, - audioBuffer=this.audioCtx.createBuffer(this.option.channels,length,this.option.sampleRate), - audioData, - channel, - offset, - i, - decrement; - - for(channel=0; channel<this.option.channels; channel++) - { - audioData=audioBuffer.getChannelData(channel); - offset=channel; - decrement=50; - for(i=0; i<length; i++) - { - audioData[i]=this.samples[offset]; - /* fadein */ - if(i<50) - { - audioData[i]=(audioData[i]*i)/50; - } - /* fadeout*/ - if(i>=(length-51)) - { - audioData[i]=(audioData[i]*decrement--)/50; - } - offset+=this.option.channels; - } - } - - if(this.startTime<this.audioCtx.currentTime) - { - this.startTime=this.audioCtx.currentTime; - } - //console.log('start vs current '+this.startTime+' vs '+this.audioCtx.currentTime+' duration: '+audioBuffer.duration); - bufferSource.buffer=audioBuffer; - bufferSource.connect(this.gainNode); - bufferSource.start(this.startTime); - this.startTime+=audioBuffer.duration; - this.samples=new Float32Array(); -}; - -PCMPlayer.prototype.getTimestamp=function() -{ - if(this.audioCtx) - { - return this.audioCtx.currentTime; - } - else - { - return 0; - } -}; - -PCMPlayer.prototype.play=function(data) -{ - if(!this.isTypedArray(data)) - { - return; - } - - data=this.getFormatedValue(data); - if(!data.length) - { - return; - } - - var bufferSource=this.audioCtx.createBufferSource(), - length=data.length/this.option.channels, - audioBuffer=this.audioCtx.createBuffer(this.option.channels,length,this.option.sampleRate), - audioData, - channel, - offset, - i, - decrement; - - for(channel=0; channel<this.option.channels; channel++) - { - audioData=audioBuffer.getChannelData(channel); - offset=channel; - decrement=50; - for(i=0; i<length; i++) - { - audioData[i]=data[offset]; - /* fadein */ - if(i<50) - { - audioData[i]=(audioData[i]*i)/50; - } - /* fadeout*/ - if(i>=(length-51)) - { - audioData[i]=(audioData[i]*decrement--)/50; - } - offset+=this.option.channels; - } - } - - if(this.startTime<this.audioCtx.currentTime) - { - this.startTime=this.audioCtx.currentTime; - } - //console.log('start vs current '+this.startTime+' vs '+this.audioCtx.currentTime+' duration: '+audioBuffer.duration); - bufferSource.buffer=audioBuffer; - bufferSource.connect(this.gainNode); - bufferSource.start(this.startTime); - this.startTime+=audioBuffer.duration; -}; - -PCMPlayer.prototype.pause=function() -{ - if(this.audioCtx.state==='running') - { - this.audioCtx.suspend() - } +PCMPlayer.prototype.init = function(option) { + var defaults = { + encoding: "16bitInt", + channels: 1, + sampleRate: 8000, + flushingTime: 1000 + } + this.option = Object.assign({}, defaults, option) + this.samples = new Float32Array() + this.flush = this.flush.bind(this) + this.interval = setInterval(this.flush, this.option.flushingTime) + this.maxValue = this.getMaxValue() + this.typedArray = this.getTypedArray() + this.createContext() } -PCMPlayer.prototype.resume=function() -{ - if(this.audioCtx.state==='suspended') - { - this.audioCtx.resume() - } -} \ No newline at end of file +PCMPlayer.prototype.getMaxValue = function() { + var encodings = { + "8bitInt": 128, + "16bitInt": 32768, + "32bitInt": 2147483648, + "32bitFloat": 1 + } + + return encodings[this.option.encoding] ? encodings[this.option.encoding] : encodings["16bitInt"] +} + +PCMPlayer.prototype.getTypedArray = function() { + var typedArrays = { + "8bitInt": Int8Array, + "16bitInt": Int16Array, + "32bitInt": Int32Array, + "32bitFloat": Float32Array + } + + return typedArrays[this.option.encoding] ? typedArrays[this.option.encoding] : typedArrays["16bitInt"] +} + +PCMPlayer.prototype.createContext = function() { + this.audioCtx = new (window.AudioContext || window.webkitAudioContext)() + this.gainNode = this.audioCtx.createGain() + this.gainNode.gain.value = 1 + this.gainNode.connect(this.audioCtx.destination) + this.startTime = this.audioCtx.currentTime +} + +PCMPlayer.prototype.isTypedArray = function(data) { + return data.byteLength && data.buffer && data.buffer.constructor == ArrayBuffer +} + +PCMPlayer.prototype.feed = function(data) { + if (!this.isTypedArray(data)) return + data = this.getFormatedValue(data) + var tmp = new Float32Array(this.samples.length + data.length) + tmp.set(this.samples, 0) + tmp.set(data, this.samples.length) + this.samples = tmp +} + +PCMPlayer.prototype.getFormatedValue = function(data) { + var data = new this.typedArray(data.buffer), + float32 = new Float32Array(data.length), + i + + for (i = 0; i < data.length; i++) { + float32[i] = data[i] / this.maxValue + } + return float32 +} + +PCMPlayer.prototype.volume = function(volume) { + this.gainNode.gain.value = volume +} + +PCMPlayer.prototype.destroy = function() { + if (this.interval) { + clearInterval(this.interval) + } + this.samples = null + this.audioCtx.close() + this.audioCtx = null +} + +PCMPlayer.prototype.flush = function() { + if (!this.samples.length) return + var bufferSource = this.audioCtx.createBufferSource(), + length = this.samples.length / this.option.channels, + audioBuffer = this.audioCtx.createBuffer(this.option.channels, length, this.option.sampleRate), + audioData, + channel, + offset, + i, + decrement + + for (channel = 0; channel < this.option.channels; channel++) { + audioData = audioBuffer.getChannelData(channel) + offset = channel + decrement = 50 + for (i = 0; i < length; i++) { + audioData[i] = this.samples[offset] + /* fadein */ + if (i < 50) { + audioData[i] = (audioData[i] * i) / 50 + } + /* fadeout*/ + if (i >= length - 51) { + audioData[i] = (audioData[i] * decrement--) / 50 + } + offset += this.option.channels + } + } + + if (this.startTime < this.audioCtx.currentTime) { + this.startTime = this.audioCtx.currentTime + } + //console.log('start vs current '+this.startTime+' vs '+this.audioCtx.currentTime+' duration: '+audioBuffer.duration); + bufferSource.buffer = audioBuffer + bufferSource.connect(this.gainNode) + bufferSource.start(this.startTime) + this.startTime += audioBuffer.duration + this.samples = new Float32Array() +} + +PCMPlayer.prototype.getTimestamp = function() { + if (this.audioCtx) { + return this.audioCtx.currentTime + } else { + return 0 + } +} + +PCMPlayer.prototype.play = function(data) { + if (!this.isTypedArray(data)) { + return + } + + data = this.getFormatedValue(data) + if (!data.length) { + return + } + + var bufferSource = this.audioCtx.createBufferSource(), + length = data.length / this.option.channels, + audioBuffer = this.audioCtx.createBuffer(this.option.channels, length, this.option.sampleRate), + audioData, + channel, + offset, + i, + decrement + + for (channel = 0; channel < this.option.channels; channel++) { + audioData = audioBuffer.getChannelData(channel) + offset = channel + decrement = 50 + for (i = 0; i < length; i++) { + audioData[i] = data[offset] + /* fadein */ + if (i < 50) { + audioData[i] = (audioData[i] * i) / 50 + } + /* fadeout*/ + if (i >= length - 51) { + audioData[i] = (audioData[i] * decrement--) / 50 + } + offset += this.option.channels + } + } + + if (this.startTime < this.audioCtx.currentTime) { + this.startTime = this.audioCtx.currentTime + } + //console.log('start vs current '+this.startTime+' vs '+this.audioCtx.currentTime+' duration: '+audioBuffer.duration); + bufferSource.buffer = audioBuffer + bufferSource.connect(this.gainNode) + bufferSource.start(this.startTime) + this.startTime += audioBuffer.duration +} + +PCMPlayer.prototype.pause = function() { + if (this.audioCtx.state === "running") { + this.audioCtx.suspend() + } +} + +PCMPlayer.prototype.resume = function() { + if (this.audioCtx.state === "suspended") { + this.audioCtx.resume() + } +} -- Gitblit v1.8.0