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

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

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

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

Q&A

解決済

1回答

618閲覧

swift3 avaudioplayerでの再生音楽選択後、一時停止後に続きからの再生不可

swiftttt

総合スコア7

Swift

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

1グッド

1クリップ

投稿2017/09/22 15:34

###前提・実現したいこと
ご覧いただき、ありがとうございます。

swift3にてアプリを作成しています。
音源A,B,Cがあるとして、segmented Controlにて、どれか一つを選択し、音楽を再生、一時停止、停止した箇所(続き)からの再生をしたいと考えています。

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

一時停止後に再生を押下すると、停止箇所からの再生ではなく、 最初から再生されてしまう エラーメッセージ:なし

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

var seg:Int = 0 @IBAction func minPlay(_ sender: Any) { //セグメント番号で条件分岐 switch (sender as AnyObject).selectedSegmentIndex { case 0: seg = 0 case 1: seg = 1 case 2: seg = 2 default: break } } @IBAction func tapPlay(_ sender: Any) { if seg == 0 { let audioPath = Bundle.main.path(forResource: "A", ofType:"mp3")! self.audioURL = URL(fileURLWithPath: audioPath) self.audioPlayer = try! AVAudioPlayer(contentsOf: self.audioURL) audioPlayer.play() } else if seg == 1 { let audioPath = Bundle.main.path(forResource: "B", ofType:"mp3")! self.audioURL = URL(fileURLWithPath: audioPath) self.audioPlayer = try! AVAudioPlayer(contentsOf: self.audioURL) audioPlayer.play() } else if seg == 2 { let audioPath = Bundle.main.path(forResource: "C", ofType:"mp3")! self.audioURL = URL(fileURLWithPath: audioPath) self.audioPlayer = try! AVAudioPlayer(contentsOf: self.audioURL) audioPlayer.play() } } @IBAction func tapPause(_ sender: Any) { audioPlayer.pause() }

###試したこと

当初はsegmented Controlの各caceにaudioPathを記載しましたが、一時停止後の再生は最初から再生になってしまいました。

###補足情報(言語/FW/ツール等のバージョンなど)

Xcode8.3.3 swift3

DrqYuto👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

tapPlayで再生開始、tapPauseで一時停止して、tapPlayで続きから再生という動作をさせたいのだと推測します。現状、tapPlayは実行されるたびに、AVAudioPlayerを生成します。そのため、続きから再生という期待した動作になりません。
再生中にtapPauseが実行されたら、audioPlayer.pause()で一時停止に、
一時停止中にtapPauseが実行されたら、audioPlayer.play()で続きから再生するように書いてみました。
曲がセットされていない状態で一時停止ボタンを押すと、アプリがクラッシュするので、起動時には一時停止ボタンが押せなくなっています。
以上、参考にしてください。

テスト環境

  • MacOS Sierra 10.12.6
  • Xcode 9.0 Build version 9A235
  • Apple Swift version 4.0 (swiftlang-900.0.65 clang-900.0.37)

swift

1import UIKit 2import AVFoundation 3 4class ViewController: UIViewController { 5 6 @IBOutlet weak var pauseButton: UIButton! 7 8 var audioPlayer = AVAudioPlayer() 9 var seg = 0 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 // Do any additional setup after loading the view, typically from a nib. 14 15 pauseButton.isEnabled = false 16 17 } 18 19 override func didReceiveMemoryWarning() { 20 super.didReceiveMemoryWarning() 21 // Dispose of any resources that can be recreated. 22 } 23 24 @IBAction func minPlay(_ sender: Any) { 25 // セグメント番号で条件分岐 26 switch (sender as AnyObject).selectedSegmentIndex { 27 case 0: 28 seg = 0 29 case 1: 30 seg = 1 31 case 2: 32 seg = 2 33 default: 34 break 35 } 36 } 37 38 @IBAction func tapPlay(_ sender: Any) { 39 if seg == 0 { 40 // let audioPath = Bundle.main.path(forResource: "A", ofType:"mp3")! 41 guard let audioPath = Bundle.main.path(forResource: "A", ofType: "mp3") else { 42 print("A not found") 43 return 44 } 45 // self.audioURL = URL(fileURLWithPath: audioPath) 46 // self.audioPlayer = try! AVAudioPlayer(contentsOf: self.audioURL) 47 // audioPlayer.play() 48 play(path: audioPath) 49 50 } else if seg == 1 { 51 // let audioPath = Bundle.main.path(forResource: "B", ofType:"mp3")! 52 guard let audioPath = Bundle.main.path(forResource: "B", ofType: "mp3") else { 53 print("B not found") 54 return 55 } 56 // self.audioURL = URL(fileURLWithPath: audioPath) 57 // self.audioPlayer = try! AVAudioPlayer(contentsOf: self.audioURL) 58 // audioPlayer.play() 59 play(path: audioPath) 60 61 } else if seg == 2 { 62 // let audioPath = Bundle.main.path(forResource: "C", ofType:"mp3")! 63 guard let audioPath = Bundle.main.path(forResource: "C", ofType: "mp3") else { 64 print("C not found") 65 return 66 } 67 // self.audioURL = URL(fileURLWithPath: audioPath) 68 // self.audioPlayer = try! AVAudioPlayer(contentsOf: self.audioURL) 69 // audioPlayer.play() 70 play(path: audioPath) 71 72 } 73 } 74 75 @IBAction func tapPause(_ sender: Any) { 76 77 if audioPlayer.isPlaying { 78 audioPlayer.pause() 79 print(audioPlayer) 80 } else { 81 audioPlayer.play() 82 print(audioPlayer) 83 } 84 } 85 86 func play(path: String) { 87 88 let audioURL = URL(fileURLWithPath: path) 89 90 do { 91 audioPlayer = try AVAudioPlayer(contentsOf: audioURL) 92 } catch { 93 print(error) 94 } 95 96 audioPlayer.play() 97 print(audioPlayer) 98 99 pauseButton.isEnabled = true 100 } 101 102} 103

投稿2017/09/22 22:30

izkn

総合スコア1698

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

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

swiftttt

2017/09/22 23:42

izknさま 閲覧ありがとうございます。 拙い質問(tapPlayで再生開始、tapPauseで一時停止して、tapPlayで続きから再生という動作はご認識の通りです。説明不足失礼致しました)に対し、丁寧なご回答、ありがとうございます。 早速、試させて頂いたところ、 tapPause(一時停止)->tapPause(再開) が問題なく実行できました。 この度はご回答いただきまして、ありがとうございました。 Appleのフォーラムは英語のため、どこで質問しようか困っておりました。 これで滞っていた作業が進められます。大感謝です。 ベストアンサーとさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問