質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Web Audio

Web Audioは、音声を処理・合成するためのWebアプリケーション向けJavaScript APIです。HTML5から導入されました。オーディオソースの選択、エフェクト・ビジュアライゼーションの追加、パンニングなど特殊効果の適用など多くの機能を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2131閲覧

Web Audio APIでマイクから取得したinputBufferを再生したい

hosh

総合スコア5

Web Audio

Web Audioは、音声を処理・合成するためのWebアプリケーション向けJavaScript APIです。HTML5から導入されました。オーディオソースの選択、エフェクト・ビジュアライゼーションの追加、パンニングなど特殊効果の適用など多くの機能を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/12/10 13:07

前提・実現したいこと

JavaScriptのWeb Audio APIを利用して、マイクから受け取ったバッファをそのまま再生したいのですが、取得したバッファ(e.inputBuffer)の再生がうまくいきません。

該当のソースコード

JavaScript

1const handleSuccess = function(stream) { 2 const context = new AudioContext(); 3 const source = context.createMediaStreamSource(stream); 4 const processor = context.createScriptProcessor(1024, 1, 1); 5 const playSource = context.createBufferSource(); 6 7 source.connect(processor); 8 processor.connect(context.destination); 9 10 processor.onaudioprocess = function(e) { 11 12 // 再生 13 playSource.buffer = e.inputBuffer.getChannelData(0); 14 playSource.connect(context.destination); 15 playSource.start(); 16 17 }; 18}; 19 20navigator.mediaDevices.getUserMedia({ audio: true, video: false }) 21 .then(handleSuccess);

発生しているエラーメッセージ

Uncaught TypeError: Failed to set the 'buffer' property on 'AudioBufferSourceNode': Failed to convert value to 'AudioBuffer'.

試したこと

Web RTCを利用した簡単な方法(https://github.com/webrtc/samples/blob/gh-pages/src/content/getusermedia/audio/js/main.jsなど)も試してみましたが、一つ一つのバッファを取得したいため、onaudioprocessイベントを使用した方法を利用したいと思っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ScriptProcessorNode の使い方がおかしい気がします。

js

1 processor.onaudioprocess = function(e) { 2 3 // 再生 4 playSource.buffer = e.inputBuffer.getChannelData(0); 5 playSource.connect(context.destination); 6 playSource.start(); 7 8 };

audioprocessイベントでは、ScriptProcessorNodeに入力された inputBuffer を処理して outputBuffer に渡すことが必要です。e.inputBuffer.getChannelData(0) の内容を e.outputBuffer.getChannelData(0) にコピーする必要があります。

しかし、マイク入力をそのまま出力したいというゴールなら ScriptProcessorNode は不要で、source をそのまま context.destination につなげればいいです。

js

1source.connect(context.destination);

投稿2021/12/12 23:43

編集2021/12/15 02:51
int32_t

総合スコア20914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hosh

2021/12/15 14:08

速やかな回答有難うございます! outputBuffer もあるのですね。 もう少し詳しく調べてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問