AVPlayer 不播放音频
AVPlayer is not playing audio
我正在尝试播放用 MPMediaPickerController
选取的 url 音频文件,并在 player
对象上附加观察者。我不知道为什么播放器不播放音频文件,设备上没有声音输出,也没有显示错误。
var timeObserverToken: Any?
func addPeriodicTimeObserver(url: URL) {
let playerItem = AVPlayerItem(url: url)
let player = AVPlayer(playerItem: playerItem)
player.play()
// Invoke callback every half second
let interval = CMTime(seconds: 0.5,
preferredTimescale: CMTimeScale(NSEC_PER_SEC))
let mainQueue = DispatchQueue.main
timeObserverToken = player.addPeriodicTimeObserver(forInterval: interval, queue: mainQueue) { [weak self] time in
//it is never called
print("time is \(time)")
}
}//end addPeriodicTimeObserver
您应该在 class/struct 中将 AVPlayer
声明为 全局 变量。因此,从 addPeriodicTimeObserver
函数中删除 player
并全局声明。
这背后的原因是:
局部变量(在函数内部声明的变量)被释放一旦函数returns;在这种情况下,player
在 甚至播放之前 被释放。
实例变量(在class范围内声明的变量)被释放一旦class实例被释放(除非有一个保留循环)。
如果使用真实设备进行测试,请确保其未处于静音模式
我正在尝试播放用 MPMediaPickerController
选取的 url 音频文件,并在 player
对象上附加观察者。我不知道为什么播放器不播放音频文件,设备上没有声音输出,也没有显示错误。
var timeObserverToken: Any?
func addPeriodicTimeObserver(url: URL) {
let playerItem = AVPlayerItem(url: url)
let player = AVPlayer(playerItem: playerItem)
player.play()
// Invoke callback every half second
let interval = CMTime(seconds: 0.5,
preferredTimescale: CMTimeScale(NSEC_PER_SEC))
let mainQueue = DispatchQueue.main
timeObserverToken = player.addPeriodicTimeObserver(forInterval: interval, queue: mainQueue) { [weak self] time in
//it is never called
print("time is \(time)")
}
}//end addPeriodicTimeObserver
您应该在 class/struct 中将 AVPlayer
声明为 全局 变量。因此,从 addPeriodicTimeObserver
函数中删除 player
并全局声明。
这背后的原因是:
局部变量(在函数内部声明的变量)被释放一旦函数returns;在这种情况下,player
在 甚至播放之前 被释放。
实例变量(在class范围内声明的变量)被释放一旦class实例被释放(除非有一个保留循环)。
如果使用真实设备进行测试,请确保其未处于静音模式