vue播放⾳频的两种⽅法(audio标签和audiocontext⽅法)
最近在做桌⾯端应⽤基于electron-vue,涉及⾳频播放,就简单研究⼀下。
⼀种是基于audio标签,另⼀种是基于AudioContext⽅法。
audio标签
两种实现,第⼀种是直接在HTML中使⽤标签
<audio src="../viper.mp3" controls="controls"></audio>
第⼆种是在js⽂件中使⽤
let audio = new Audio()
audio.src = "../viper.mp3"
audio.play();
但在electron中是存在问题,因为electron是基于chrome内核,所以不能直接访问本地⽂件,还请哪位⼤神指导如何规避该问题。AudioContext⽅法
其实该⽅法也存在访问本地的问题,所以借助node.js来获取⽂件。
let fs = require('fs');
let AudioContext = window.AudioContext ;
let audioCtx = AudioContext ? new AudioContext() : '';
_this.audioPlay(data);
});
audioPlay:function (data) {
let audioBufferSourceNode = ateBufferSource();
electron vue教程audioCtx.decodeAudioData(data.buffer).then(function (decodedData) {
audioBufferSourceNode.buffer = decodedData;
});
audioBufferSourceNode && audioBufferSourceNode.start(0,0,1);
}
这⾥⾯存在三个坑。
⼀是,fs.readFile返回的数据,如果不能直接解析,那么返回的是原⽣buffer,但audioBufferSourceNode.buffer需要的audioBuffer格式。
那么就需要从buffer转换到audioBuffer,⽹上暂时没有到直接⽅法,现在的解决⽅法是Buffer转arrayBuffer再转audioBuffer。
_this.audioPlay(data);
});
console.log(typeof data) //返回类型为object,就是原⽣Buffer
let dataTmp = data.buffer // arrayBuffer
audioCtx.decodeAudioData(dataTmp) //这才是最后的audioBuffer
⼆是,audioBufferSourceNode只能播放⾳频⼀次,所以这就是为什么在audioPlay⽅法中需要重新new。⽽不是抽到公共部分。
audioPlay:function (data) {
let audioBufferSourceNode = ateBufferSource();
}
三是,存在部分⾳频解析失败的情况,不知道是类型转换导致,还是audioContext⾃⾝的BUG,如果哪位⼤神指导,还请多多指点
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论