1

我目前正在尝试使用 Add-On SDK 为 Mozilla Firefox 编写音乐播放器插件。我正在使用Aurora.js ( Wiki ) 来处理加载/解复用/解码音频文件

我目前正在使用该插件,因此您可以选择带有 HTML 文件输入的音频文件,这非常简单。

    <input type="file" id="file-selector" />
    <script>
        var fileSelector = document.getElementById("file-selector");

        fileSelector.onchange = function() {
            var audioFile = fileSelector.files[0];

            var audioPlayer = AV.Player.fromFile(audioFile);

            audioPlayer.play();
        };
    </script>

不过,我目前正在尝试做的是读取从附加 SDK 返回的文件,而不是从 HTML 页面上的输入中读取的文件,然后创建一个 AV.Player。sdk/io/file使用andsdk/io/byte-streams模块读取文件非常简单。

问题是我无法弄清楚如何从这些数据中正确构建 AV.Player。从它的样子来看:

  1. AV.Player.fromFile(x)通过构造一个AV.AssetfromAV.Asset.fromFile(x)
  2. AV.Asset.fromFile(x)构造一个AV.AssetwithAV.FileSource(x)
  3. AV.FileSource是通过创建一个FileReader并将文件中的数据作为 Blob 读取来构造的

我一直在试图弄清楚如何使用 io/file.read(filePath, "br") 返回的字节数组创建一个 Blob,但没有成功。我尝试创建一个类似于具有大小、类型和切片方法的 Blob 的对象,但这似乎也不起作用。

4

1 回答 1

3

由于您将(或至少应该)在某些内容脚本(小部件、面板等)中使用 Aurora,因此事情会稍微复杂一些。

  1. 读取您的数据main.js,例如通过file您已经提到的模块。
  2. 通过消息传递该数据到内容脚本。
  3. 在内容脚本中,接收消息,将字节包装在 a 中Uint8Array并执行您的 Aurora 操作:

    addon.port.on("bytes-loaded", function(stream) {
      var data = new Uint8Array(stream.length);
      for (var i = 0; i < stream.length; ++i) {
          data[i] = String.charCodeAt(stream[i]) & 0xff;
      }
      avPlayer = AV.Player.fromBuffer(data);
    });
    

file模块不是很好,因为它是一个同步 API,在读取文件时会阻塞,但至少有一个替代方案

可以在此构建器中找到一个完整的NetUtil异步文件读取示例,并且无需将字符串转换为 Javascript 领域的数组,但请确保替换硬编码路径。;)

于 2013-09-18T14:41:40.247 回答