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

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

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

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

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

0回答

1695閲覧

audioContextの現在再生時間をinput type=rangeと連動させたい。

TofuLove

総合スコア14

Web Audio

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

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/09/04 15:47

編集2020/09/05 00:10

前提

オーディオの読み込みが終わると押せるようになる再生ボタンを押すと、音楽が流れるものを制作しています。
下記はデモです。
デモ(CodeSandBox)
音楽ファイルを読み込むと、音楽の総再生時間を表示します。

デモは下記を使用しています。

  • React.js
  • Web Audio API

実現したいこと

  • 現在の再生時間を表示したいです。
  • 音楽が進むと自動でinput type=rangeも動かしたいです。
  • input type=rangeを動かすと、inputvalueに対応する再生位置で、音楽を再生させたいです。

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

音楽が進んでもinput type=rangeは動かず、input type=rangeを動かしても音楽の再生位置が変わることなく、そのまま再生され続けます。

該当のソースコード

js

1let audioCtx, audioBuffer, sampleSource; 2const audioURL = "/piano.mp3"; 3 4const App = () => { 5 const [loaded, setLoaded] = useState(false); 6 const [playing, setPlaying] = useState(false); 7 const [total, setTotal] = useState(0); 8 const [current, setCurrent] = useState(0); 9 10 const audioLoad = async () => { 11 const response = await fetch(audioURL); 12 const arrayBuffer = await response.arrayBuffer(); 13 if (arrayBuffer) { 14 audioBuffer = await audioCtx.decodeAudioData(arrayBuffer); 15 setTotal(audioBuffer.duration); 16 } 17 setLoaded(true); 18 }; 19 useEffect(() => { 20 audioCtx = new (window.AudioContext || window.webkitAudioContext)(); 21 audioLoad(); 22 return () => { 23 audioCtx.close(); 24 audioCtx = null; 25 }; 26 }, []); 27 28 const playAudio = () => { 29 if (!playing) { 30 sampleSource = audioCtx.createBufferSource(); 31 sampleSource.buffer = audioBuffer; 32 sampleSource.connect(audioCtx.destination); 33 sampleSource.start(); 34 setPlaying(true); 35 return; 36 } 37 sampleSource.disconnect(); 38 setCurrent(0); 39 setPlaying(false); 40 }; 41 42 const changeSeek = (e) => { 43 setCurrent(e.target.value); 44 audioCtx.currentTime = current; 45 console.log(audioCtx.currentTime); 46 }; 47 48 return ( 49 <> 50 <p>曲の長さ {total}</p> 51 <p>現在再生時間 {current}</p> 52 <button onClick={playAudio} disabled={loaded ? false : true}> 53 {playing ? "停止" : "再生"} 54 </button> 55 <input 56 onChange={changeSeek} 57 value={current} 58 type="range" 59 max={total} 60 style={inputStyle} 61 /> 62 </> 63 ); 64}; 65 66const inputStyle = { 67 width: "100%" 68};

試したこと

input type=rangevalue属性にaudioContext.currentTimeを設定したところ、下記のエラーが表示されました。

Cannot read property 'currentTime' of undefined

また、audioContext.currentTimeの値をコンソールで確認したところ、音源の現在再生時間ではなく、audioContextが生成されてから経過した時間と思われる値が表示されました。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問