web-dev-qa-db-ja.com

javascriptで.wavファイルを.oggに変換する

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

これが Matt Diamond's 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用のものはありますか?

33
himura

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

この仕様では、Webアプリケーションでオーディオを処理および合成するための高レベルのJavaScriptAPIについて説明します。主要なパラダイムはオーディオルーティンググラフであり、多数の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の native-client を使用することもできます。サンドボックスにロードされ、ネイティブで実行されるコードとほぼ同じ速度を実現する、非常に有望なテクノロジーのようです。ある時点で、他のブラウザにも同様の実装があると思います。

18
jtrick

この質問は私を夢中にさせました。なぜなら、誰も本当にクリーンな解決策を思い付くのを見たことがないので、私は自分のライブラリを思いついたのです。

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/ ==

まだ端が荒いですが、掃除/直してみます。

11
Sam

[〜#〜] new [〜#〜]Matt Diamondのrecorderjsレコーディングの派生物Ogg-Opus

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

Ogg-Vorbisエンコーダー 利用可能

質問者は主に音声圧縮を目的としているため、 mp3lameを使用したエンコーディング にも関心がある可能性があります。

4
Rainer Rillke

.wav.oggに変換する方法が記載されていないため、これは直接的な答えではない可能性があります。繰り返しになりますが、.oggファイルを直接実行できるのに、なぜ変換に煩わされるのでしょうか。これは MediaRecorder API に依存しますが、WebAudioをサポートするブラウザには通常これもあります(Firefox25 +およびChrome 47+)

github.ioデモ

Githubコードソース

1
mido