35

ブラウザからユーザーのオーディオ入力をキャプチャしようとしています。私は WAV でそれをやったが、ファイルは本当に大きいです。私の友人は、OGG ファイルの方がはるかに小さいと教えてくれました。WAVをOGGに変換する方法を知っている人はいますか? 私は生データバッファも持っています。実際に変換する必要はありません。しかし、OGG エンコーダーが必要なだけです。

Matt Diamond の RecorderJSの WAV エンコーダーは次のとおりです。

function encodeWAV(samples){
  var buffer = new ArrayBuffer(44 + samples.length * 2);
  var view = new DataView(buffer);

  /* RIFF identifier */
  writeString(view, 0, 'RIFF');
  /* file length */
  view.setUint32(4, 32 + samples.length * 2, true);
  /* RIFF type */
  writeString(view, 8, 'WAVE');
  /* format chunk identifier */
  writeString(view, 12, 'fmt ');
  /* format chunk length */
  view.setUint32(16, 16, true);
  /* sample format (raw) */
  view.setUint16(20, 1, true);
  /* channel count */
  view.setUint16(22, 2, true);
  /* sample rate */
  view.setUint32(24, sampleRate, true);
  /* byte rate (sample rate * block align) */
  view.setUint32(28, sampleRate * 4, true);
  /* block align (channel count * bytes per sample) */
  view.setUint16(32, 4, true);
  /* bits per sample */
  view.setUint16(34, 16, true);
  /* data chunk identifier */
  writeString(view, 36, 'data');
  /* data chunk length */
  view.setUint32(40, samples.length * 2, true);

  floatTo16BitPCM(view, 44, samples);

  return view;
}

OGG用のものはありますか?

4

4 に答える 4

19

この投稿に反対票を投じた人へ: 質問がどういうわけか「悪い」理由について何らかの洞察を提供する時間をとらずに、質問に反対票を投じるのは本当に生産的ではありません。この質問にはメリットがあると思います。投稿者は明らかに、問題を自分で解決しようと時間を費やしてきました。Web オーディオ仕様は、実際にはまさにこの種の機能を許可することを目的としていますが、まだその目的を達成するにはほど遠いものです。

この仕様では、Web アプリケーションでオーディオを処理および合成するための高レベルの JavaScript API について説明します。主なパラダイムは、オーディオ ルーティング グラフです。ここでは、多数の AudioNode オブジェクトが相互に接続されて、全体的なオーディオ レンダリングが定義されます。実際の処理は主に基盤となる実装 (通常は最適化されたアセンブリ / C / C++ コード) で行われますが、直接のJavaScript 処理と合成もサポートされています。

以下は、現在の w3cオーディオ スペック ドラフトに関する声明であり、次の点を示しています。

  • JavaScript でオーディオを処理している間、特にプロセッサの負荷が高い場合に、適度に低いレイテンシーを達成しながら、信頼性の高いグリッチのないオーディオを取得することは非常に困難です。
  • JavaScript は、高度に最適化された C++ コードよりもはるかに遅く、今日のプロセッサで優れたパフォーマンスを得るために重要な SSE 最適化とマルチスレッドを利用できません。最適化されたネイティブ コードは、JavaScript と比較して、FFT の処理が 20 倍程度高速になる可能性があります。多数のオーディオ ソースの畳み込みや 3D 空間化など、オーディオの負荷の高い処理には十分に効率的ではありません。
  • setInterval() と XHR の処理は、オーディオ処理から時間を盗みます。かなり複雑なゲームでは、ゲームの物理とグラフィックスのためにいくつかの JavaScript リソースが必要になります。これは、オーディオ レンダリングがデッドライン ドリブンであるため (グリッチを回避し、レイテンシを十分に低くするため)、課題を生み出します。JavaScript はリアルタイム処理スレッドで実行されないため、システムで実行されている他の多くのスレッドによってプリエンプトされる可能性があります。
  • ガベージ コレクション (および Mac OS X の自動解放プール) は、JavaScript スレッドで予期しない遅延を引き起こす可能性があります。
  • 複数の JavaScript コンテキストがメイン スレッドで実行されている可能性があり、処理を行っているコンテキストから時間を盗んでいます。
  • ページ レンダリングなどの他のコード (JavaScript 以外) は、メイン スレッドで実行されます。
  • ロックを取得でき、JavaScript スレッドにメモリが割り当てられます。これにより、追加のスレッド プリエンプションが発生する可能性があります。
  • この問題は、プロセッサのパフォーマンスが比較的低く、消費電力やバッテリ寿命の問題が多い今日の世代のモバイル デバイスではさらに困難です。

ECMAScript (js) は多くの点で非常に高速であり、コードを解釈しているエンジンに応じて常に高速になっています。ただし、オーディオ処理のように集中的な処理を行う場合は、タスクに固有のリソースを最適化するようにコンパイルされた低レベルのツールを使用する方がはるかに優れています。私は現在、サーバー側でffmpegを使用して同様のことを実現しています。

よりコンパクトな .ogg ファイルを取得するためだけに、インターネット接続を介して wav ファイルを送信する必要があるのは非常に非効率的であることはわかっていますが、それが Web オーディオ API の現状です。クライアント側の処理を実行するには、ユーザーはローカル ファイル システムへのアクセス権と、変換を行うファイルの実行権限を明示的に付与する必要があります。誰かがこの明白な問題にすぐに対処してくれることを願っています。幸運を。

編集:ユーザーを Chrome に制限しても構わない場合は、 Google のネイティブ クライアントを使用することもできます。サンドボックスにロードし、ネイティブに実行されるコードとほぼ同じ速度を実現する、非常に有望なテクノロジのようです。ある時点で、他のブラウザにも同様の実装があると思います。

于 2013-07-16T18:08:28.397 に答える
11

誰も本当にきれいな解決策を考え出すのを見たことがないので、この質問は私を夢中にさせてきました。

https://github.com/sb2702/audioRecord.js

基本的な使い方

audioRecord.requestDevice(function(recorder){
  // Request user permission for microphone access

      recorder.record(); // Start recording

      recorder.stop();  /Stop recording

      recorder.exportOGG(function(oggBlob){
        //Here's your OGG file
      });

      recorder.exportMP3(function(mp3Blob){
               //Here's your mp3 file
      });

      recorder.exportWAV(function(wavBlob){
            //Here's your WAV file
      });

});

連続 mp3 エンコーディング オプションを使用すると、サーバーやネイティブ コードを使用せずに、オーディオ入力を完全にブラウザー (クロスブラウザー) でキャプチャしてエンコードするのが合理的です。

デモ: http://sb2702.github.io/audioRecord.js/

エッジの周りはまだ荒いですが、きれいにして修正しようと思います。

于 2015-06-19T00:59:54.247 に答える
5

NEW : Matt Diamondのrecorderjs録音のOgg-Opusへの派生作品

特別な拡張子を付けずにブラウザーでファイル全体をOgg-Opusにエンコードするには、 opus-tools/opusenc (demo)の Emscripten ポートを使用できます。WAV、AIFF、およびその他のいくつかの形式のデコードサポートと、組み込みのリサンプラーが付属しています。

Ogg -Vorbisエンコーダーも利用できます

質問者は主にオーディオ圧縮に関心があるため、 lame を使用したmp3エンコーディングにも関心がある可能性があります。

于 2014-12-25T18:23:07.347 に答える