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

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

新規登録して質問してみよう
ただいま回答率
85.49%
JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

0回答

1800閲覧

formから取得してきた文字列を利用して複数のmp3を連続して再生したい

imohori708

総合スコア10

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2018/05/17 12:29

編集2018/05/17 13:01

ボタンを押すことで音楽を再生できるホームページを作成しています。
以下のプログラムを使って、音声ファイル1.mp3,音声ファイル2.mp3,音声ファイル3.mp3を再生する仕組みです。

HTML

1<button type="button" class="sounds" data-file="./sound/音声ファイル1">音声ファイル1</button>

JavaScript

1// グローバル変数 2var syncerSounds = { 3 flag: {} , 4 currentTime: null , 5} ; 6// 即時関数 7(function() 8{ 9 // 設定 10 var setClass = 'sounds' ; // ボタン要素のクラス名 11 var setDir = './' ; // 音声ファイルがあるフォルダ(最後は[/]) 12 var setStopButtonId = 'stop-button' ; // 停止ボタンに付けるID 13 14 // クラス名が付いた要素を取得する 15 var sounds = document.getElementsByClassName( setClass ) ; 16 17 // 全ての要素にクリックイベントを設定する 18 for( var i=0,l=sounds.length ; l>i ; i++ ) 19 { 20 // クリックイベントの設定 21 sounds[i].onclick = function() 22 { 23 // ファイル名の取得(getAttributeはtype,value,maxlengthの値を取得) 24 var file = this.getAttribute( 'data-file' ) ; 25 26 // 一度生成したエレメントは生成しない 27 if( typeof( syncerSounds.flag[ file ] )=="undefined" || syncerSounds.flag[ file ] != 1 ) 28 { 29 // 生成するエレメントの調整 30 var audio = document.createElement( 'audio' ) ; 31 32 // エレメントのIDを指定 33 audio.id = file ; 34 audio.src = setDir + file + '.mp3' ; 35 36 // [audio]を生成する 37 document.body.appendChild( audio ) ; 38 } 39 40 // 初回再生以外だったら音声ファイルを巻き戻す 41 stopCurrentSound() ; 42 // 音声ファイルを再生[play()]する 43 document.getElementById( file ).play() ; 44 // 最近再生した音声としてセット 45 syncerSounds.currentTime = file ; 46 // 初回再生が終わった判定用に[syncerSounds.flag]の値を0から1に変更する 47 // エレメントを何度も生成しないようにするため 48 syncerSounds.flag[ file ] = 1 ; 49 // 終了 50 return false ; 51 } 52 } 53 // 前回の音声を停止する関数 54 function stopCurrentSound() 55 { 56 var currentSound = document.getElementById( syncerSounds.currentTime ) ; 57 if( currentSound != null ) 58 { 59 currentSound.pause() ; 60 currentSound.currentTime = 0 ; 61 } 62 } 63 // 停止ボタンをクリックした時のイベント 64 document.getElementById( setStopButtonId ).onclick = function() 65 { 66 stopCurrentSound() ; 67 return false ; 68 } 69})() ;

上記のコードを改造し、
①formへ文字列を入力
②文字列をリストに分割
③リストの第一要素から順に再生クラスへ再生したいmp3名を受け渡す
④再生が最後まで終わるのを待って、第二要素、第三要素…とリストの最後の要素まで順に渡し、mp3を順番に再生する
といった処理を作りたいのですが、2曲目まで上手く動くにも関わらず、三曲以上連続で再生しようとすると、下記エラーが出て1曲目と最後の曲だけ再生されてしまいます。
Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause()

こちら(https://foolean.net/p/679)のHPを参考に、再生が終了していることを判断してループを回すような処理を組みましたが、同様の結果でした。

HTML

1//フォームへの文字列入力コード 2<form name="voiceForm" id="id_voiceform" value=""> 3<input type="text" id="id_textBox1" name="voiceText" value=""><br> 4<button type="button" onClick="getStr()">連続再生</button> 5<input type="button" name="addButton" src="add.jpg" value="&quot;音声ファイル1&quot;" class="btn" onClick="addStr(this.value)" ></button> 6<input type="button" name="addButton" src="add.jpg" value="&quot;音声ファイル2&quot;" class="btn" onClick="addStr(this.value)" ></button> 7<input type="button" name="addButton" src="add.jpg" value="&quot;音声ファイル3&quot;" class="btn" onClick="addStr(this.value)" ></button>

JavaScript

1var voice; 2var playingVoice; 3//フォームへ文字を入力するクラス 4function addStr(str) 5{ 6 document.voiceForm.voiceText.value += str; 7} 8//取得した文字列を整形し、mp3を再生するクラス 9function getStr(){ 10 var voiceListString = document.forms.id_voiceform.id_textBox1.value; 11 var voiceList = []; //ボイスを連続再生する際に使うリストの初期化 12 13 voiceList = voiceListString.split('""'); 14 15 var listLength = voiceList.length; 16 17 // 先頭から1文字を削除 18 voiceList[0]= voiceList[0].slice(1); 19 // 末尾から1文字を削除 20 voiceList[listLength-1]= voiceList[listLength-1].slice( 0, -1 ); 21 22 for(var i = 0; i < listLength; i++){ 23 playingVoice=voiceList[i]; 24 if(i>0){ 25 voice.addEventListener("ended",function(e){ 26 ContinuityVoice(); 27 }); 28 }else{ 29 ContinuityVoice(); 30 } 31 //voiceList[i].addEventListener("ended", function(e)) 32 } 33} 34//複数のmp3を連続で再生するクラス 35function ContinuityVoice(){ 36 // 設定 37 var setClass = 'sounds' ; // ボタン要素のクラス名 38 var setDir = './' ; // 音声ファイルがあるフォルダ(最後は[/]) 39 var setStopButtonId = 'stop-button' ; // 停止ボタンに付けるID 40 var soundFile = "./sound/"+playingVoice; 41 42 // ファイル名の取得(getAttributeはtype,value,maxlengthの値を取得) 43 var file = soundFile; 44 45 // 一度生成したエレメントは生成しない 46 if( typeof( syncerSounds.flag[ file ] )=="undefined" || syncerSounds.flag[ file ] != 1 ){ 47 // 生成するエレメントの調整 48 var audio = document.createElement( 'audio' ) ; 49 50 // エレメントのIDを指定 51 audio.id = file ; 52 audio.src = setDir + file + '.mp3' ; 53 54 // [audio]を生成する 55 document.body.appendChild( audio ) ; 56 } 57 58 // 初回再生以外だったら音声ファイルを巻き戻す 59 stopCurrentSound(); 60 61 voice = document.getElementById( file ); 62 63 // 音声ファイルを再生[play()]する 64 voice.play() ; 65 // 最近再生した音声としてセット 66 syncerSounds.currentTime = file ; 67 // 初回再生が終わった判定用に[syncerSounds.flag]の値を0から1に変更する 68 // エレメントを何度も生成しないようにするため 69 syncerSounds.flag[ file ] = 1 ; 70 71 // 終了 72 return false ; 73} 74// 前回の音声を停止する関数 75function stopCurrentSound(){ 76 var currentSound = document.getElementById( syncerSounds.currentTime ) ; 77 78 if( currentSound != null ) 79 { 80 currentSound.pause() ; 81 currentSound.currentTime = 0 ; 82 } 83 // 停止ボタンをクリックした時のイベント 84 document.getElementById( setStopButtonId ).onclick = function() 85 { 86 stopCurrentSound() ; 87 return false ; 88 } 89} 90

現在発生しているエラーを取り除き、正しく複数のmp3を連続して再生するにはどのような修正をすればよろしいでしょうか。
よろしくお願いします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問