Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:本地文件中的音频在没有HTML的情况下无法播放&书信电报;音频>&引用;元素存在_Javascript_Audio - Fatal编程技术网

Javascript:本地文件中的音频在没有HTML的情况下无法播放&书信电报;音频>&引用;元素存在

Javascript:本地文件中的音频在没有HTML的情况下无法播放&书信电报;音频>&引用;元素存在,javascript,audio,Javascript,Audio,现在这一次真的让我很困惑,所以我希望看看是否有人能发现我做错了什么 基本上,我有一个包含两个元素的页面。一个是HTML5文件处理程序,第二个是按钮。当用户选择一个文件时,我会响应生成的onchange事件,解码音频并构造一个要使用的缓冲区。我知道有HTML5音频标签,但这将是一个实用程序,需要能够将文件分解为可管理的块 我做了几次测试,发现我自己解码的音频只有在播放完页面上的音频元素后才会播放。我完全不知道是什么导致了这种行为,因为我在网上研究了几个播放音频的例子。我将包括我的音频引擎下面 只是

现在这一次真的让我很困惑,所以我希望看看是否有人能发现我做错了什么

基本上,我有一个包含两个元素的页面。一个是HTML5文件处理程序,第二个是按钮。当用户选择一个文件时,我会响应生成的onchange事件,解码音频并构造一个要使用的缓冲区。我知道有HTML5音频标签,但这将是一个实用程序,需要能够将文件分解为可管理的块

我做了几次测试,发现我自己解码的音频只有在播放完页面上的音频元素后才会播放。我完全不知道是什么导致了这种行为,因为我在网上研究了几个播放音频的例子。我将包括我的音频引擎下面

只是澄清一下,所有的事情都是由这段代码处理的

多谢各位

"use strict";

var AudioFile = function (){
  this.length = 0; // Number of samples
  this.duration = 0; // Time in seconds
  this.sampleRate = 0; // Sample rate
  this.channels = 0; // Number of channels
  this.data = []; //Audio/Waveform data
};

var audioCtx = null;

class AudioEngine {
  constructor (){
    // All of the necessary audio control variables
    if(!audioCtx){
      window.AudioContext = window.AudioContext || window.webkitAudioContext;
      audioCtx = new AudioContext();
    }

    // Will hold audio data waiting to be played
    this.buffer = null;

    // This will hold the decoded audio file upon completion
    this.decodedFile = new AudioFile();

    // Automatically create buffer upon finished decoding?
    this.autoCreateBuffer = true;

    // Specify this if you want to have a function recieve
    // the decoded audio, i.e. completionCallback(decodedFile);
    this.completionCallback = null;
  }

  // This will decode an audio file
  fileCallback (event){
    console.log("file callback");
    this.buffer = null;

    var reader = new FileReader();
    var file = event.target.files[0];
    reader.onload = this.loadCallback.bind(this);

    reader.readAsArrayBuffer(file);
  }

  // Called by fileCallback after file has been loaded
  loadCallback (file){
    console.log("load callback");
    var raw = file.target.result;
    audioCtx.decodeAudioData(raw, this.decodeCallback.bind(this));
  }

  // Called by loadCallback after file has been decoded
  decodeCallback (data){
    console.log("decode callback");
    var audioTemp = new AudioFile();

    audioTemp.length = data.length;
    audioTemp.duration = data.duration;
    audioTemp.sampleRate = data.sampleRate;
    audioTemp.channels = data.numberOfChannels;

    var arr = [];
    for(var i = 0; i < data.numberOfChannels; i++){
      arr.push(new Float32Array(data.length));
      data.copyFromChannel(arr[i], i);
    }

    audioTemp.data = arr.slice(0);
    this.decodedFile = audioTemp;

    if(this.autoCreateBuffer){
      var buffer = audioCtx.createBuffer(audioTemp.channels, audioTemp.length, audioTemp.sampleRate);

      var samples;
      for(var c = 0; c < audioTemp.channels; c++){
        samples = buffer.getChannelData(c);
        for(var i = 0; i < audioTemp.length; i++){
          samples[i] = this.decodedFile.data[c][i];
        }
      }

      this.buffer = buffer;
    }

    if(this.completionCallback){
      this.completionCallback(audioTemp);
    }
  }

  // Play data that is in buffer
  play(){
    if(this.buffer){
      var source = audioCtx.createBufferSource();
      var tmp = this.buffer.getChannelData(0);

      source.buffer = this.buffer;
      source.connect(audioCtx.destination);
      source.start(0);
      console.log("play");
    }
  }
}
“严格使用”;
var AudioFile=函数(){
this.length=0;//样本数
this.duration=0;//以秒为单位的时间
this.sampleRate=0;//采样率
this.channels=0;//通道数
this.data=[];//音频/波形数据
};
var audioCtx=null;
类音频引擎{
构造函数(){
//所有必要的音频控制变量
如果(!audioCtx){
window.AudioContext=window.AudioContext | | window.webkitadiocontext;
audioCtx=新的AudioContext();
}
//将保存等待播放的音频数据
this.buffer=null;
//这将在完成后保存解码的音频文件
this.decodedFile=新音频文件();
//解码完成后自动创建缓冲区?
this.autoCreateBuffer=true;
//如果要接收函数,请指定此选项
//解码音频,即completionCallback(解码文件);
this.completionCallback=null;
}
//这将解码音频文件
文件回调(事件){
log(“文件回调”);
this.buffer=null;
var reader=new FileReader();
var file=event.target.files[0];
reader.onload=this.loadCallback.bind(this);
reader.readAsArrayBuffer(文件);
}
//加载文件后由fileCallback调用
加载回调(文件){
log(“加载回调”);
var raw=file.target.result;
decodeAudioData(原始,this.decodeCallback.bind(this));
}
//文件解码后由loadCallback调用
解码回调(数据){
log(“解码回调”);
var audioTemp=新音频文件();
audioTemp.length=data.length;
audioTemp.duration=data.duration;
audioTemp.sampleRate=data.sampleRate;
audioTemp.channels=data.numberOfChannels;
var-arr=[];
对于(变量i=0;i
好的,我已经找出了问题所在。这段代码目前正处于测试阶段,似乎与firefox上打开的控制台有关,它会干扰播放的声音。虽然,这与它的行为并不完全一致,但至少我知道我所遇到的问题的一般原因


换句话说,“audio”元素在控制台是否打开时没有问题,但是在使用JavaScript控制的音频打开/最小化控制台时,似乎存在未定义的行为。但是,当控制台关闭时,它的行为总是与预期的一样。

好的,我已经找出了问题所在。这段代码目前正处于测试阶段,似乎与firefox上打开的控制台有关,它会干扰播放的声音。虽然,这与它的行为并不完全一致,但至少我知道我所遇到的问题的一般原因


换句话说,“audio”元素在控制台是否打开时没有问题,但是在使用JavaScript控制的音频打开/最小化控制台时,似乎存在未定义的行为。但是,当控制台关闭时,它的行为总是与预期的一样。

现在我真的很困惑。我决定对我的代码进行一次快速测试,测试结果与预期相符。也许这是我使用的浏览器(firefox)的一个bug,这绝对值得研究。我不知道如何复制它…现在我真的很困惑。我决定对我的代码进行一次快速测试,测试结果与预期相符。也许这是我使用的浏览器(firefox)的一个bug,这绝对值得研究。但是我不知道如何复制它。。。