web-dev-qa-db-ja.com

クライアント側JavaScriptでWAVを任意の圧縮オーディオ形式に変換する

Recorder.js を使用してブラウザーでgetUserMedia({audio:true});からオーディオを録音し、それをWAVファイルとしてエクスポートします。これは、ライブラリが提供する唯一のオプションだからです。

1分20秒のファイルのサイズは14.1 MBです。音声をサーバーにアップロードする必要があり、それを高速に行う必要があります。 WAVオーディオを他の圧縮形式に変換してファイルサイズを小さくするにはどうすればよいですか?

次のように変換してもかまいません。

  • MP3
  • オーパス
  • WebM
  • オッグ
  • FLAC
  • あなたが知っている他のフォーマット

現在、これらの形式に変換する方法がない場合、クライアントでWAVファイルを圧縮するにはどうすればよいですか?

PS:私はJSでWAVを変換するものを見つけるために多くの検索を行いましたが、何も見つかりませんでした。 libmp3lame.js はChromeでは機能しません。

ありがとう!

31
Arjun Bajaj

RecorderJSとlibmp3lame.jsを組み合わせたブラウザーから直接mp3に録音するオーディオレコーダーを作成しました

ここでgitHubプロジェクトを見つけることができます: https://github.com/nusofthq/Recordmp3js

実装の詳細な説明: http://nusofthq.com/blog/recording-mp3-using-only-html5-and-javascript-recordmp3-js/

31
Remus Negrota

あなたが本当に望んでいるのは、現在取り組んでいるmediaStream "Recording API"です。それが利用可能になるまで、C/C++ソースでemscriptemを使用することをお勧めします。UIや他のタブをブロックしないように、webworkerで実行することを検討してください。

4
jesup

私は同じ問題に直面していて、非常に迅速で汚い解決策を思い付きました:

  • wav-fileをZip.jsで圧縮します(Chrome、Firefox、Safari 6およびInternet Explorer 10で動作します)

さらに詳しい情報は Documentation Zip.js を参照してください

少なくともこれによりサイズが大幅に削減され、ファイルは約75%小さくなります1:4圧縮

更新:多分これを見てください: https://webrtc.github.io/samples/

これは、ChromeおよびFirefoxがgoogleによって開発されたチャットアプリケーションです。一種のCC-Licenseと想定しています。

3
AddingColor

私も同様の問題があり(recorder.jsも使用)、emscripenを使用してJavascriptへのffmpegのポートを含むすばらしい videoconverter.js プロジェクトを使用して解決できました。これの欠点は、ffmpeg.jsファイルが約25Mbであることです。

RecorderWorker.jsの既存のexportWAV関数を変更して、両方のWAVを返すようにしました(HTML5の場合<audio> playing)とエンコードされたMP2ファイルを含むBlob:

function encodeWAV(samples) {

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

  /* ... various writing methods */

  return { wavdata: new Blob([buffer], { type: "audio/wav" }), mp2data: ffmpeg_convert(buffer) };
}

function ffmpeg_convert(buffer) {
    console.log("starting mp2 conversion");
    var args = "-i input -f mp2 output.mp2";
    var results = ffmpeg_run({
        arguments: args.split(" "),
        files: [
          {
              data: new Uint8Array(buffer),
              "name": "input"
          }
        ]
    });
    if (results) {
        var file = results[0];
        console.log("File recieved", file.name, file.data);
        return new Blob([file.data], { type: "audio/mpeg" });
    }
    return null;
}

このメソッドは、ffmpegのlibavcodecがサポートする任意のコーデックにWAVをエンコードするために使用できます。

2
CodingIntrigue

opus.js を使用して圧縮を実現できました

ここに私の実装を見つけることができます: recordOpus ですが、問題があり、サーバーサイドと結合されており、node.jsサーバー..。

1
mido