数十秒の音声を再生したいとおもって、下記コードで試しても再生できなく、エラーが出ることもなく、困っていました。
再生されないコード
@IBAction private func tappedButton(_ sender: UIButton) {
let url = URL(string: "https://sample.com/music.mp3")!
let player = AVPlayer(url: url)
player.play()
}
いろいろ調べてもわからず、結局自分でひらめいて解決しました。
再生できるコード
var player: AVPlayer?
@IBAction private func tappedButton(_ sender: UIButton) {
let url = URL(string: "https://sample.com/music.mp3")!
player = AVPlayer(url: url)
player?.play()
}
function 内で生成したインスタンスがすぐ開放されてしまっていたということですね。
インスタンスを保持しておけるよう、変数を function の外に出して解決しました。
ARC のおかげで日々メモリを意識せずコーディングできてますが、その弊害が出てしまった感じでしょう。
おまけ: ストリーミング再生は AVAudioPlayer ではない
音声再生する場合 AVAudioPlayer
を使ってしまいそうになりますが、これはローカルのファイルを扱う物らしいので、
ストリーミング再生したい場合は AVPlayer
を使います。
参照: https://stackoverflow.com/a/17007441
環境
- Swift 4.2
- Xcode 10.1