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

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

ただいまの
回答率

92.06%

  • Swift

    3329questions

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

  • Xcode

    1941questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

swift オーディオプレイヤー 作成

解決済

回答 1

投稿 2017/01/09 13:51

  • 評価
  • クリップ 0
  • VIEW 232

Tatsu876

score 9

前提・実現したいこと

Swiftの初心者です。オーディオの再生アプリを作っています。他の再生ボタンを押すと、現在再生されている曲が止まるようにコードを書きたいのですがどのようにすればいいでしょうか? 停止ボタンなし。

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

EXC BAD INSTRUCTION
エラーメッセージ
```

該当のソースコード

swift

import UIKit
import AVFoundation

class ViewController: UIViewController {

var player:AVAudioPlayer!
var player2:AVAudioPlayer!
var player3:AVAudioPlayer!

var player4:AVAudioPlayer!
var player5:AVAudioPlayer!
var player6:AVAudioPlayer!

let url = Bundle.main.bundleURL.appendingPathComponent("ken.mp3")
let url2 = Bundle.main.bundleURL.appendingPathComponent("Dra.mp3")
let url3 = Bundle.main.bundleURL.appendingPathComponent("Dra.mp3")

let url4 = Bundle.main.bundleURL.appendingPathComponent("Dra.mp3")
let url5 = Bundle.main.bundleURL.appendingPathComponent("Dra.mp3")
let url6 = Bundle.main.bundleURL.appendingPathComponent("Dra.mp3")

//最初からあるメソッド
override func viewDidLoad() {
super.viewDidLoad()

do {
try player = AVAudioPlayer(contentsOf:url)
try player2 = AVAudioPlayer(contentsOf:url2)
try player3 = AVAudioPlayer(contentsOf:url)

try player4 = AVAudioPlayer(contentsOf:url)
try player5 = AVAudioPlayer(contentsOf:url)
try player6 = AVAudioPlayer(contentsOf:url)

//音楽をバッファに読み込んでおく
player.prepareToPlay()
player2.prepareToPlay()
player3.prepareToPlay()

player4.prepareToPlay()
player5.prepareToPlay()
player6.prepareToPlay()

} catch {
print(error)
}
}

//再生ボタン1押下時の呼び出しメソッド
@IBAction func pushButton1(sender: UIButton) {
//音楽を再生する。
player3.stop()
player2.stop()
player.play()

//再生ボタン2押下時の呼び出しメソッド
@IBAction func pushButton2(sender: UIButton) {
player.stop()
player3.stop()
player2.play()
}

//再生ボタン3押下時の呼び出しメソッド
@IBAction func pushButton3(sender: UIButton) {
player.stop()
player2.stop()
player3.play()
}

//再生ボタン4押下時の呼び出しメソッド
@IBAction func pushButton4(sender: UIButton) {
//音楽を再生する。
player5.stop()
player6.stop()
player4.play()
}

@IBAction func pushButton5(sender: UIButton) {
//音楽を再生する。
player4.stop()
player6.stop()
player5.play()
}

@IBAction func pushButton6(sender: UIButton) {
//音楽を再生する。
player4.stop()
player5.stop()
player6.play()
}

}

試したこと

ifを使った

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

より詳細な情報

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

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

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

簡単にやるのでしたら以下の方法でできます、AVAudioPlayerは1つあれば大丈夫です。
今のコードだとかっこの位置がずれていて@IBActionが入れ子で入っているのでエラーが出ますよ。

import UIKit
import AVFoundation

class ViewController: UIViewController {

    var player:AVAudioPlayer!

    let url = Bundle.main.bundleURL.appendingPathComponent("ken.mp3")
    let url2 = Bundle.main.bundleURL.appendingPathComponent("Dra.mp3")
    let url3 = Bundle.main.bundleURL.appendingPathComponent("Dra.mp3")

    let url4 = Bundle.main.bundleURL.appendingPathComponent("Dra.mp3")
    let url5 = Bundle.main.bundleURL.appendingPathComponent("Dra.mp3")
    let url6 = Bundle.main.bundleURL.appendingPathComponent("Dra.mp3")


    override func viewDidLoad() {
        super.viewDidLoad()

    }

    func play(url: URL) {
        do {
            try player = AVAudioPlayer(contentsOf:url)
            player.play()

        } catch {
            print(error)
        }
    }

    //再生ボタン1押下時の呼び出しメソッド
    @IBAction func pushButton1(sender: UIButton) {
        play(url: url)
    }

    //再生ボタン2押下時の呼び出しメソッド
    @IBAction func pushButton2(sender: UIButton) {
        play(url: url2)
    }

    //再生ボタン3押下時の呼び出しメソッド
    @IBAction func pushButton3(sender: UIButton) {
        play(url: url3)
    }

    // 以下略
}

参考URL: [iOS][Swift]AVAudioPlayerを使う(リソースファイルを使う)

投稿 2017/01/09 14:25

編集 2017/01/09 14:33

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/01/09 14:59

    ありがとうございます。作動しました!
    オーディオ(2〜3秒ほど)を大量に再生出来るようにアプリを作りたいのですが、player.prepareToPlay() などバッファに読み込んでおくコードは省略した方が良いでしょうか?

    キャンセル

  • 2017/01/09 15:52

    調べてみましたが以下のサイトには書いたほうが良いとの記述があるので、書いたほうが良いとおもいます。キューに入れてやる方法も書いてあるので参考にしてみてください。

    http://yamaimo.hatenablog.jp/entry/2015/12/22/200000

    キャンセル

  • 2017/01/09 16:03

    ありがとうございます!こちらのサイトを見ながら書いてみます。

    キャンセル

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

ただいまの回答率

92.06%

関連した質問

同じタグがついた質問を見る

  • Swift

    3329questions

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

  • Xcode

    1941questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

閲覧数の多いXcodeの質問