🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Q&A

解決済

2回答

3514閲覧

HTMLの<audio>のplay()に関してDOMExceptionのエラー

Shoto9023

総合スコア11

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

0グッド

0クリップ

投稿2020/11/25 08:01

トラックが結構ある中で、セレクトボックスでトラックを選択、再生し、再生が終了したら次のトラックへaudioタグを変更して再生、また終了したら…といったことを実装しようとして、以下のコードを書きましたが、ローカルで動かすと問題なく動いた(ように見えた)のですが、サーバーに上げてから実行するとトラックが飛ばされるため、コンソールを見たところエラーが吐かれていました。

js

1変数formにはセレクトボックスが入っています 2変数aには<audio>タグが入っています 3変数numには現在のトラックナンバー(セレクトボックスから取得)が数値で入っています 4変数tracksにはトラックリストが配列形式で入っています 5 6コード 7~ 8a.addEventListener("ended", function () { 9 num = num + 1; 10 form.selectedIndex = num; 11 a.currentTime = 0; 12 a.src = tracks[num]; 13 a.play(); 14}, false); 15~

エラー
VM5 script.js:17 Uncaught (in promise) DOMException: The play() request was interrupted by a new load request.

google developersへの参照がついていたので読んで色々と試してみましたがうまく行きませんでした…

どのようにすると解決できますか?

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

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

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

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

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

guest

回答2

0

src属性値を変更したあと、loadeddataイベントが来るのを待ってからplay()するべきかもしれませんね。

https://developer.mozilla.org/ja/docs/Web/API/HTMLMediaElement/loadeddata_event

投稿2020/11/25 11:07

gpsoft

総合スコア1323

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

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

0

ベストアンサー

ローカルで動かすと問題なく動いた(ように見えた)のですが、サーバーに上げてから実行するとトラックが飛ばされる

a.src を変更すると、サーバー(ブラウザキャッシュ)から読み込みますが、この時の遅延を考慮します
(読み込みが完了していない状態で play() を実行するとエラーになる)。

どのようにすると解決できますか?

<audio>要素のイベント を駆使して、「音源の交換時(最中)にプレイヤーは音を出せない」という特徴に着目します。


現在はファイル化された圧縮音源が一般的ですが、古いオーディオ機器についても調べてみるとヒントになります。
ソース(音源)の入れ替えは(テープ媒体/光ディクス媒体)物理的媒体の交換作業が付きまといます。

圧縮音源の現在も、音源媒体(ファイル)の交換は、ローカルマシンのディスクから高速に行われるのか、ネットワークを経由して(サーバー/ネットワークの状態で)必ず遅延が伴なうのか、微妙な違いを考える必要があります。

  • ソース管理機能(「ジュークボックス」や「CDチェンジャー」のような、音源媒体の管理・交換機能をプログラムで実現)
  • プレイヤー機能(セットされた1つの媒体について、再生/停止/早送り/巻き戻しなどをプログラムで実現)

投稿2020/11/25 11:50

AkitoshiManabe

総合スコア5434

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

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

Shoto9023

2020/11/26 06:11

つまり、ロードが終わるイベントをリッスンしてplay()するか、load()を実行してからplay()するかすれば実行できるということでしょうか? これらの方法に問題があるかもしれないと不安になってしまったので聞かせていただきました。 原因などについては非常にわかりやすい回答をありがとうございます。
AkitoshiManabe

2020/11/26 06:28

gpsoft さんの回答が、ソースの読み込みイベントを待つ。という内容になっており、高評価させていただいております(コード上は端的な回答に感じました)。 ご質問の全体像からは「ソースを切り替える毎にイベントを待つ必要がある」と感じました。 私なら <audio> (HTMLAudioElement)をラップするなどして、抽象化を考えます(既存のプレイヤー系ライブラリを探して参考にする)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問