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

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

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

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

Q&A

解決済

1回答

252閲覧

Swift 再生中の音を取得してページ移動・ボタン押下で停止させたい。

torkia

総合スコア24

Swift

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

0グッド

0クリップ

投稿2018/07/12 11:31

編集2018/07/17 10:55

お世話になります。

AVAudioPlayerを使用してボタン押下で再生/停止、ページ移動で停止させたいのですが、思い通りにいきません。
原因・解決方法など教えて頂けないでしょうか。
宜しくお願い致します。

---やりたいこと---
●再生中の音をページ移動する時に、停止させる。
●再生中の音と同じボタン押下で、停止させる。
●再生中の音とは別のボタン押下で、再生中の音を停止させ、押されたボタンに割り当てられた音を再生する。
(サンプルのコードでは1ページにつき16コのボタンを用意しています。)

###試したこと
ボタン押下されたら、ボタンメソッド内でplay()させ、変数currentPlayerに代入して、次に押されたボタンが同じボタンだった場合はcurrentPlayerと同じ音が割り当てられたかを(ここ1)のところで条件をだしているのですが、ここのスコープ内には全く入ってこず、再生中の音がある場合は、すべて(ここ2)の方へ流れていってしまってます。なので、同じボタンを押した場合は再生中の音は停止してまた同じ音を再生し始めてしまいます。本当は停止だけさせたいのですが。

同じボタンを押しても変数audioPlayerには同じ名前のAVAudioPlayerが入っておらず(ここ1)のif文内に入ってくれないのだと思うのですが、どうすればいいか分かりません。

###該当のソースコード

サンプルでは、配列soundNameArray内の1つの配列に16コのmp3データがあり、ページ数は20ページあります。
サンプルでは、2種類のmp3データを使い回して試しています。(ファイル名は1.mp3、2.mp3)
サンプルでは、tableViewのセルから画面遷移して遷移先のページから音の再生やページスクロールする仕様にしています。

// 使用Version: Swift3 import UIKit import AVFoundation class PageContentViewController: UIViewController, AVAudioPlayerDelegate { let soundNameArray = [ ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 1 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 2 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 3 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 4 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 5 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 6 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 7 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 8 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 9 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 10 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 11 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 12 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 13 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 14 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 15 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 16 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 17 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 18 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"], // 19 ["1","2","1","2","1","2","1","2","1","2","1","2","1","2","1","2"] // 20 ] var pageIndex:Int = 0 // 各ページのindex let indexPageLabel = UILabel() // index確認用ラベル // sound関係 var soundArray:[String] = [] // ファイル名のデータを格納する var audioPlayer:AVAudioPlayer! // urlから音声データにして格納する var soundButtons = [UIButton]() // 音声を鳴らすボタンを格納する var currentPlayer:AVAudioPlayer? override func viewDidLoad() { super.viewDidLoad() // indexPageラベル indexPageLabel.frame = CGRect(x: 20, y: 10, width: 240, height: 20) indexPageLabel.text = "pageIndex: (pageIndex) ページNo: ((pageIndex) + 1)" indexPageLabel.backgroundColor = .yellow self.view.addSubview(indexPageLabel) soundArray = soundNameArray[pageIndex] // サウンドボタンを量産 button for index in 0..<soundArray.count { let soundButton = UIButton() soundButton.frame = CGRect(x: 20, y: 40 + (index * 30), width: 40, height: 30) soundButton.backgroundColor = UIColor.lightGray soundButton.titleLabel?.font = UIFont.systemFont(ofSize: 10) soundButton.setTitle("▶", for: .normal) soundButton.setTitleColor(UIColor.darkGray, for: .normal) soundButton.tag = index // ボタン識別用ID soundButton.addTarget(self, action: #selector(buttonEventSound(sender:)), for: .touchUpInside) soundButtons.append(soundButton) self.view.addSubview(soundButton) } } //viewDidLoadを閉じる override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if currentPlayer != nil { if (currentPlayer?.isPlaying)! { currentPlayer?.stop() currentPlayer?.currentTime = 0 } } currentPlayer = nil } // ボタンイベント音再生 func buttonEventSound(sender: UIButton) { let index = sender.tag let audioPath = Bundle.main.path(forResource: "(soundArray[index])", ofType:"mp3")! let audioUrl = URL(fileURLWithPath: audioPath) do { audioPlayer = try AVAudioPlayer(contentsOf: audioUrl) audioPlayer.delegate = self audioPlayer.prepareToPlay() } catch { print("エラー") } if currentPlayer != nil { if (currentPlayer?.isPlaying)! { if currentPlayer == audioPlayer { currentPlayer?.stop() currentPlayer?.currentTime = 0 currentPlayer = nil print("ここ1") } else { currentPlayer?.stop() currentPlayer?.currentTime = 0 audioPlayer.play() currentPlayer = audioPlayer print("ここ2") } } } else { audioPlayer.play() currentPlayer = audioPlayer print("ここ3") } } // 音楽再生が成功した時に呼ばれるメソッド func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { currentPlayer = nil print("音終了") } // デコード中にエラーが起きた時に呼ばれるメソッド func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) { print("デコードエラー") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }

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

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

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

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

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

guest

回答1

0

自己解決

同じボタンを押したかどうかを

変数の値が、同じ音データかどうかの条件をやめて、
[if currentPlayer == audioPlayer]

変数の値が、同じボタンのtagデータを持ってメソッドに入ってきたかを問う条件にした。
(再生中の音のボタンは、今押したボタンかどうか)
[if currentButtonIndex == index]

(略) var currentButtonIndex:Int? // 追加コード override func viewDidLoad() { super.viewDidLoad() (略) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if currentPlayer != nil { if (currentPlayer?.isPlaying)! { currentPlayer?.stop() currentPlayer?.currentTime = 0 } } currentPlayer = nil currentButtonIndex = nil // 追加コード } // ボタンイベント音再生 func buttonEventSound(sender: UIButton) { let index = sender.tag let audioPath = Bundle.main.path(forResource: "(soundArray[index])", ofType:"mp3")! let audioUrl = URL(fileURLWithPath: audioPath) do { audioPlayer = try AVAudioPlayer(contentsOf: audioUrl) audioPlayer.delegate = self audioPlayer.prepareToPlay() } catch { print("エラー") } if currentPlayer != nil { if (currentPlayer?.isPlaying)! { if currentButtonIndex == index { // ここを変更 currentPlayer?.stop() currentPlayer?.currentTime = 0 currentPlayer = nil } else { currentPlayer?.stop() currentPlayer?.currentTime = 0 audioPlayer.play() currentPlayer = audioPlayer currentButtonIndex = index // 追加コード } } } else { audioPlayer.play() currentPlayer = audioPlayer currentButtonIndex = index // 追加コード } }

投稿2018/07/17 10:52

torkia

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問