1

現在、アドオン 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>

私が現在やろうとしているのは、HTML ページの入力からのファイルではなく、アドオン SDK から返されたファイルを読み取り、AV.Player を作成することです。sdk/io/fileおよびsdk/io/byte-streamsモジュールを使用すると、ファイルの読み取りは簡単です。

問題は、このデータから AV.Player を適切に構築する方法がわからないことです。それがどのように見えるかから:

  1. AV.Player.fromFile(x)AV.Assetfromを構築することによって機能しますAV.Asset.fromFile(x)
  2. AV.Asset.fromFile(x)with を構築AV.AssetしますAV.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 であるため、あまり良くありませんが、少なくとも1 つの代替手段があります。

NetUtil非同期ファイル読み取りを使用し、Javascript ランドで文字列を配列に変換する必要がない完全な例は、このビルダーにありますが、ハードコーディングされたパスを必ず置き換えてください。;)

于 2013-09-18T14:41:40.247 に答える