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

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

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

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

Swift

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

Q&A

解決済

2回答

3253閲覧

Swiftでのサウンド再生について

Inu.2016

総合スコア17

iOS

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

Swift

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

1グッド

1クリップ

投稿2017/06/02 11:10

swift3でサウンドをうまく再生できません。

アプリゲーム開発をしています。AVAudioPlayerを使用して効果音を再生しようとしています。

ビルドも通って、デバッグでステップ実行しながら、再生処理をすると、音が普通に鳴ります。
しかし、通常プレイ時に音が出ません。

何かおかしい所があるでしょうか?

また、他に確実に音を鳴らすことができる方法があるでしょうか?

よろしくお願いいたします。

/* === 実行用 Test Class (Test.swift) === */

class Test{

/* 他のコード・・・ */ let AD = Audio("result") AD.playSound() /* 再生用メソッド */ /* 他のコード・・・ */

}

/* === Audio Class (別ファイル Audio.swift) === */

import AVFoundation

class Audio{

var player:AVAudioPlayer! var fileName = "" init(_ fileName:String){ self.fileName = fileName let audioPath = Bundle.main.path(forResource: fileName, ofType: "mp3") let audioUrl = URL(fileURLWithPath: audioPath!) do{ player = try AVAudioPlayer(contentsOf: audioUrl) player.prepareToPlay() }catch let error as NSError{ print(error.debugDescription) } } func playSound(){ if player.isPlaying{ player.stop() } player.play() print("\(self.fileName) sound was played") }

}

DrqYuto👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

let AD = Audio("result") AD.playSound() /* 再生用メソッド */

の書かれた部分はおそらく何かのメソッドの一部でしょうか。
ステップ実行では音が鳴る、ということは、通常実行時にはすぐにそのメソッドの実行が終了してしまい(playは再生終了を待たずに次の行へ実行を進めてしまう)、音が鳴り終わる前にAVAudioPlayerが解放されてしまっている可能性があります。
少なくとも音を鳴らし終わるまではAVAudioPlayerが生き残るように修正する必要があるかと思います。ADをローカル変数からインスタンス変数に移すのが手軽でしょうが(参考:SwiftでAVAudioPlayerを使ってサウンドファイルを再生する - xykのブログ)、色々な音を重ねて鳴らそうとする場合は少々工夫が必要かと思います。
Objective-Cに関する記事ですが、ARC環境下でAVAudioPlayerを使い柔軟かつシンプルにサウンドを再生する方法 - Qiitaなどは参考になりますでしょうか。

[追記]
効果音、とのことで短い音を想像しましたが、もしそうでしたら、その効果音の代わりにある程度長い曲を流して、その状態でステップ実行してみる...なんていうのはどうでしょう。曲が途中で止まるかどうかで問題箇所を絞り込めるかもしれません。

投稿2017/06/02 20:30

編集2017/06/03 08:55
Bongo

総合スコア10807

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

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

Inu.2016

2017/06/05 14:21

まさにご指摘の通りの原因でした。 ローカル変数にインスタンスを格納してしまうとすぐに解放されてしまうという事を失念しておりました。 ありがとうございました。
guest

0

全然検討違いの回答だったらごめんなさい。気になったり、こうじゃないかなってこと書いて見ます。
<気になる1>

func

1 2if player.isPlaying{ 3player.stop() 4}

のところですが、音楽再生をストップする処理のように思えます。このplaySound()を予期せぬところで使っているなどはありませんか?

<気になる2>
あと、音楽再生などやアンメーションの処理がsuper.viewDidLoad()内に書いてあると、画面遷移後など音楽は再生されなくなってしまいます。その際は、

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) }

を作ってその中に処理を書いてあげる必要があります。がそれかなともおもったりしました。なので戻って来たりするのなら両方に音楽再生の処理を入れる感じになるかと思いました。

<気になる3>
すみません、内容について詳しく説明はできませんがplayer.prepareToPlay()の後にaudioPlayer.play()で音楽を再生するのですが、それはコード全体見れていないのでなんとも言えませんが、ちゃんとデバッグでその流れが通っていますでしょうか?

<気になる4>
音楽再生のデリゲートはきっと自分のクラス内で行っていると思うのですが、そのさいデリゲートをselfにしていますでしょうか?他クラスならそのクラスにしないといけないきもしますが。

最後に一応自分が書いたことあるコード乗せておきますね!参考になれば嬉しいです。

let audioPath = Bundle.main.path(forResource: "Recollection", ofType:"mp3")! let audioUrl = URL(fileURLWithPath: audioPath) var audioError:NSError? do { audioPlayer = try AVAudioPlayer(contentsOf: audioUrl) } catch let error as NSError { audioError = error audioPlayer = nil } if let error = audioError { print("Error \(error.localizedDescription)") } audioPlayer.delegate = self audioPlayer.prepareToPlay() audioPlayer.play() audioPlayer.numberOfLoops = -1

ちなみに最後のLoopは私は音楽をずっと流していたかったので入れただけなので、一回だったら確か1とかにすれば大丈夫なような。

投稿2017/06/03 07:43

編集2017/06/03 07:46
sachiko-kame

総合スコア334

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問