Zwei Methoden zum Abspielen von Audio in Vue (Audio-Tag- und Audiokontext-Methode)

Vor kurzem arbeite ich an einer Desktop-Anwendung, die auf Electron-Vue basiert und Audiowiedergabe beinhaltet, daher werde ich sie kurz studieren.

Eine basiert auf dem Audio-Tag und die andere auf der AudioContext-Methode.

Audio-Tag

两种实现,第一种是直接在HTML中使用标签
<audio src="../viper.mp3" controls="controls"></audio>
第二种是在js文件中使用

    let audio = new Audio()
    audio.src = "../viper.mp3"
    audio.play();

Es gibt jedoch ein Problem bei Electron. Da Electron auf dem Chrome-Kernel basiert, kann es nicht direkt auf lokale Dateien zugreifen. Kann mir bitte jemand helfen, wie ich dieses Problem vermeiden kann?

AudioContext-Methoden

Tatsächlich weist diese Methode auch das Problem des lokalen Zugriffs auf, sodass zum Abrufen der Datei node.js verwendet wird.

let fs = require('fs');
let AudioContext = window.AudioContext ;
let audioCtx = AudioContext ? new AudioContext() : '';


fs.readFile(_this.voicePath,function(err, data){
      _this.audioPlay(data);
});

audioPlay:function (data) {
    let audioBufferSourceNode = audioCtx.createBufferSource();
    audioCtx.decodeAudioData(data.buffer).then(function (decodedData) {
        audioBufferSourceNode.buffer = decodedData;
    });
    audioBufferSourceNode.connect(audioCtx.destination);
    audioBufferSourceNode && audioBufferSourceNode.start(0,0,1);
}
Hier gibt es drei Fallstricke.
Wenn die von fs.readFile zurückgegebenen Daten nicht direkt analysiert werden können, wird zunächst der native Puffer zurückgegeben, jedoch das für audioBufferSourceNode.buffer erforderliche audioBuffer-Format.
Dann müssen Sie vom Puffer in audioBuffer konvertieren. Es gibt online keine direkte Methode. Die aktuelle Lösung besteht darin, Buffer in arrayBuffer und dann in audioBuffer zu konvertieren.
fs.readFile(_this.voicePath,function(err, data){
      _this.audioPlay(data);
});
console.log(typeof data)  //返回类型为object,就是原生Buffer

let dataTmp = data.buffer  // arrayBuffer

audioCtx.decodeAudioData(dataTmp)  //这才是最后的audioBuffer
Zweitens kann audioBufferSourceNode Audio nur einmal abspielen, weshalb es in der audioPlay-Methode neu sein muss. Anstatt auf den öffentlichen Teil hinzuweisen.
audioPlay:function (data) {
    let audioBufferSourceNode = audioCtx.createBufferSource();
}
Drittens gibt es einige Audio-Parsing-Fehler. Ich weiß nicht, ob sie durch eine Typkonvertierung oder einen Fehler im audioContext selbst verursacht werden. Wenn mir jemand eine Anleitung geben kann, geben Sie mir bitte einen Rat.

おすすめ

転載: blog.csdn.net/weixin_44325637/article/details/89248110