将来の使用のためにwebAudioAPIからの出力を保存しようとしていますが、これまでのところ、PCMデータを取得してファイルとして保存することで期待どおりになると思いますが、webAudioまたはmozAudioが出力ストリームの保存をすでにサポートしているかどうか疑問に思っています。出力ストリームからpcmデータを取得します
4 に答える
プログラム的な方法でWebオーディオをキャプチャしようとする以外に、ここでの要件をよく理解することはできません。ここでの前提は、現在閲覧されているページでJavaScriptで実行されているコードからこれを実行したいということですが、それも完全には明確ではありません。
シークレットモードで指摘されているように、Chromeでコールバックを使用してこれを行うことができますdecodeAudioData()
。ただし、たとえば、単一のWebストリームの出力をキャプチャして、選択したサウンドツールで使用するためにPCMにデコードしようとしている場合、これは使用にとって非常に複雑になる可能性があります。
メディアURLが不明瞭であるか、現在のツールを使用してデコードするのが難しい場合に考慮できるもう1つの戦略は、基になるサウンドカードからのキャプチャです。これにより、サウンドカードがストリームを効果的にサンプリングできない場合にのみ、サンプリングレートが低くなる可能性がありますが、無料でデコードできます。
私たちが知っているように、あなたはすでにPCMエンコーディングへの欲求を介してアナログ信号をデジタルでエンコードしています。明らかに、これは、サンプリングされているファイルを使用する法的権利がある場合にのみ行ってください。
選択したルートに関係なく、幸運を祈ります。プログラムによるストリーム分析でもスポットサンプリングでも、続行するのに十分な情報が得られるはずです。
編集: OPからの追加情報に基づくと、これは必要なソリューションのようです(NodeJSの実装を使用してこことここからマージされます):fs
var fs = require('fs');
function saveAudio(data, saveLocation) {
var context = new (window.AudioContext || window.webkitAudioContext)();
var source = context.createBufferSource();
if(context.decodeAudioData) {
context.decodeAudioData(data, function(buffer) {
fs.writeFile(saveLocation, buffer, function (err) {
if (err) throw err;
console.log('It\'s saved!');
});
}, function(e) {
console.log(e);
});
} else {
var buffer = context.createBuffer(data, false /*mixToMono*/);
fs.writeFile(saveLocation, buffer, function (err) {
if (err) throw err;
console.log('It\'s saved!');
});
}
}
(警告:テストされていないコード。これが機能しない場合は、編集を歓迎します。)
これは、Web Audio APIdecodeAudioData
から効果的にスプールアウトし、提供されたPCMをデコードしてから、ターゲットに保存しようとします。本当に簡単です。data
saveLocation
最新のWebAudioAPIドラフトOfflineAudioContext
は、まさにこの目的のために導入されました。
通常のAudioContextとまったく同じ方法で使用しますが、startRendering()
オフラインレンダリングをトリガーする追加のメソッドと、oncomplete
レンダリングの終了時にアクションを実行できるようにするコールバックを使用します。
Chromeはそれをサポートする必要があります(または、少なくとも、ほとんどの場合、この新機能をサポートします)。
decodeAudioData()が終了すると、デコードされたPCMオーディオデータをAudioBufferとして提供するコールバック関数を呼び出します。
これはXHR2のやり方とほぼ同じなので、抽象化レイヤーを作成することをお勧めします。
注:動作するかどうかはテストしていませんが、これに関してクロムにバグが1つだけ表示されます。これは、動作するが一部のファイルでは失敗することを示しています。
あなたが探していることは、WebAudioのstartRendering-functionで達成できると思います。上記の答えがうまくいったかどうかはわかりませんが、うまくいかなかった場合は、次のことを実行してください。
https://bugs.webkit.org/show_bug.cgi?id=57676(下にスクロールしてコメント3)
この部分はまだ文書化されていないため、仕様には表示されませんが、オーディオコンテキストをconsole.logして、実際に存在することを確認できます。私はそれを使っていくつかの予備テストを行っただけですが、それはあなたの質問に対する答えになるはずだと思います。