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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

2738閲覧

swiftでの3つ以上の音声ファイルの連続再生 + それぞれの音声の終了検知について

maslnomy

総合スコア6

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/02/26 09:07

編集2022/01/12 10:55

現在こちらの質問を参考に、2つの音声ファイルを連続で再生する機能を実装しました。
Teratail - Swift で複数ののオーディオファイルを連続で再生する方法

Swift

1 var player1: AVAudioPlayer! 2 var player2: AVAudioPlayer! 3 4 let url1 = Bundle.main.bundleURL.appendingPathComponent("test_01.mp3") 5 let url2 = Bundle.main.bundleURL.appendingPathComponent("test_02.mp3") 6 7func playerA(url1: URL, url2: URL) { 8 do { 9 try player1 = AVAudioPlayer(contentsOf: url1) 10 try player2 = AVAudioPlayer(contentsOf: url2) 11 12 player1.prepareToPlay() 13 player1.delegate = self 14 15 player1.play() 16 17 } catch { 18 print(error) 19 } 20 } 21 22func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 23 player2.play() 24 } 25 26@IBAction func startBtn(_ sender: UIButton) { 27 playerA(url1: url1, url2: url2) 28 } 29

ここから実装したいのが、以下の2つの機能です。
0. 3つ以上の音声ファイルの連続再生
0. それぞれの音声の終了検知

1.だけならAVQueueplayerを用いて実装する方法は分かりましたが、AVQueueplayerについて調べると、個々の音声ファイル再生の終了検知の方法を見つけることができませんでした。

また2.だけなら現在のコードで検知することができますが、この方法で3つ以上の音声ファイルを連続再生する方法を見つけることができませんでした。

そこでこれらの機能について、

  • AVQueueplayerを用いて、音声ファイル再生の終了を検知する方法
  • 現在のコードを用いて、3つ以上の音声ファイルの連続再生を行う方法
  • 上記2つのどちらとも異なる方法

のいずれかを教えていただければと思います。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

AVFoundationのAVAudioPlayerDelegateを使うと良いと思いますよ

swift

1import AVFoundation 2 3class AudioDelegate: NSObject, AVAudioPlayerDelegate { 4 var audio: AVAudioPlayer! 5 var urls: [URL] 6 var playNum = 0 7 8 init(urls: [URL]) { 9 self.url = url 10 } 11 12 func prepare(num: Int) -> Bool { 13 if playNum < urls.count { 14 audio = AVAudioPlayer(contentsOf: urls[num]) 15 16 audio.delegate = self 17 18 return true 19 } 20 21 return false 22 } 23 24 func startPlay() { 25 if prepare(num: playNum) { 26 audio.play 27 } 28 } 29 30 func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 31 print("Did finish") 32 33 playNum += 1 34 35 if prepare(num: playNum) { 36 audio.play 37 } 38 } 39 40}

上記のようなクラスを作っておくといいかと思います。
AVAudioPlayerDelegateを継承するとaudioPlayerDidFinishPlayingでaudio.delegate = selfでdelegateをセットしたオーディオが再生を完了すると実行される関数を作れます。

投稿2021/02/04 08:36

ArckSmith

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問