Я использую AVPlayer для воспроизведения потокового аудио через Интернет. Мне нравится восстанавливать воспроизведение, если оно было приостановлено более чем на 1 минуту.
Я призываю player.rate = 1.0
возобновить работу. Однако, если поток был приостановлен более чем на 1 минуту, он больше не воспроизводится. В этом случае мне нужно воссоздать AVPlayerItem, чтобы он снова заработал.
Итак, как мне поймать этот случай, чтобы я знал, что воспроизведение не восстановилось?
- КВО пробовал на
player.rate
. Однако он остается на уровне1.0
. Плеер не играет! - КВО пробовал на
currentItem.playbackBufferEmpty
. Однако в данном случае он не вызывается. currentItem.status
не переключается на.Failed
. Это вообще не меняется.
Кажется, что AVPlayer в этом случае ничего не делает. Любые идеи?
Я создаю код для игровой площадки, чтобы продемонстрировать проблему:
import UIKit
import AVFoundation
// keep it running forever so it plays audio
import XCPlayground
XCPSetExecutionShouldContinueIndefinitely(true)
class AVPlayerTest {
let player = AVPlayer()
let streamurl = NSURL(string: "http://detektor.fm/stream/mp3/musik/")!
func startTest() {
let item = AVPlayerItem(URL: streamurl)
player.replaceCurrentItemWithPlayerItem(item)
player.play()
// give it some start time to build a buffer
NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: #selector(timerTickedToPause), userInfo: nil, repeats: false)
}
@objc func timerTickedToPause(timer: NSTimer) {
player.pause()
// pause now for some time. 90s is not enough.
NSTimer.scheduledTimerWithTimeInterval(120, target: self, selector: #selector(timerTickedToPlay), userInfo: nil, repeats: false)
}
@objc func timerTickedToPlay(timer: NSTimer) {
// try to resume playback
print(player.rate)
player.play()
print(player.rate)
// check in some seconds if it recovered
NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: #selector(timerTickedCheck), userInfo: nil, repeats: false)
}
@objc func timerTickedCheck(timer: NSTimer) {
// it reports rate = 1.0 but is not playing here though!
// there is no way to know for me it did not recover here!?
print(player.rate)
// recover by creating a new item works
let item = AVPlayerItem(URL: streamurl)
player.replaceCurrentItemWithPlayerItem(item)
player.play()
}
}
let test = AVPlayerTest()
test.startTest()
AVPlayerItem
. Однако мне нужно знать, если это не удалось. - person funkenstrahlen   schedule 26.04.2016player.pause()
иplayer.play()
- это то же самое, что установитьplayer.rate
на0
или1
, как указано в документации Apple. После вызоваplayer.rate = 1
он не воспроизводится, ноrate
остается на1
. - person funkenstrahlen   schedule 26.04.2016