- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 AVQueuePlayer 对象的简单音频播放列表。通过迭代包含自定义 UITableViewCell 对象 PlayableAudioCell 的 UITableView 来填充队列。这些对象有一个 AVPlayerItem 属性,audioTrack,我将其插入到 AVQueueplayer 的队列中。
我想在项目播放和完成时向这些轨道添加和删除 AVPlayerItemDidPlayToEndTime 观察器,以便我可以更新我创建的音乐播放器的标签。
由于某种原因,如果队列长于 2 个轨道,则队列中的第三个轨道不会将观察者添加到其中,因为应用它的函数会传递轨道的副本,而不是轨道已保存到 PlayableAudioCell 对象。
我无法理解这是如何发生的,但我必须在某处创建轨道的副本,而不是引用单元格的音轨。从音轨存储位置的打印语句中我可以看出我是。
只是对我的应用程序布局的一些解释...它包含一个 tableViewController View ,允许用户选择一个单元格并播放一首轨道。我还有一个 SplitViewController,它允许弹出 FooterView 并显示正在播放的轨道信息(标签、持续时间、轨道 slider )。
操作顺序:
用户在 TableView 中的单元格上按下播放按钮
AudioQueuePlayer 的队列由按下的轨道及其下面的每个轨道填充
TableViewController 的委托(delegate) (FooterViewController) 调用其委托(delegate)的播放方法
AVPlayerItemDidPlayToEndTime 观察者已添加到播放的第一个项目
当跟踪结束时,观察者会调用选择器。在此选择器中,删除当前轨道的观察者,并添加将 AVPlayerItemDidPlayToEndTime 观察者添加到下一个轨道的代码。
当我访问单元格的副本或音轨的副本而不是引用 currentSelectedAudioCell 的音轨属性时,是否会弹出任何此代码?
我将省略 TableViewController 中的代码...我可以看出它在表中正确填充,并且问题必须出在 FooterViewController 的代码中:
func play(cell: PlayableAudioCell){
if let previousCell = currentlySelectedAudioCell, let prevFilename = currentlySelectedAudioCell?.chapter?.value(forKey: "Filename") as? String, let filename = cell.chapter?.value(forKey: "Filename") as? String{
if filename != prevFilename{
runningTime = 0
}
}
updateWithObserver(cell: cell)
//show footerview if it is hidden.
if(footerView.superview?.isHidden)!{
hideShowFooterView()
}
if(self.isPlaying)!{
//print("Should pause cell")
audioQueuePlayer?.pause()
switchState(state: "Pause")
playPauseRunTime(state: "Pause")
}else{
//print("Should play cell")
audioQueuePlayer?.play()
switchState(state: "Play")
playPauseRunTime(state: "Play")
}
updateFooterView()
}
func updateWithObserver(cell: PlayableAudioCell){
self.currentlySelectedAudioCell = cell
delegate?.currentlySelectedAudioCell = cell
let track = cell.audioTrack!
NotificationCenter.default.addObserver(self, selector: #selector(FooterViewController.playerItemDidReachEnd(notification:)), name: Notification.Name.AVPlayerItemDidPlayToEndTime, object: track)
}
func playerItemDidReachEnd(notification: Notification){
NotificationCenter.default.removeObserver(self, name: notification.name, object: audioQueuePlayer?.currentItem)
if didAudioPlayEntirely(){
recordAudioHistoryToFirebase(didFinish: true)
if let currentlySelectedAudioCell = delegate?.currentlySelectedAudioCell{
revealCheckMark(cell: currentlySelectedAudioCell)
}
}
runningTime = 0
//If there is just one more item in the queue, regardless of whether playAll() has been toggled...
if (audioQueuePlayer?.items().count)! <= 1 {
playPauseRunTime(state: "Pause")
audioQueuePlayer?.removeAllItems()
resetFooterViewUI()
switchState(state: "Pause")
hideShowFooterView()
audioQueuePlayer?.rate = 0.0
delegate?.currentlySelectedAudioCell = nil
currentlySelectedAudioCell = nil
delegate?.indexPathOfSelectedCell = nil
indexPathOfSelectedCell = nil
}else{
if let indexPathOfSelectedCell = indexPathOfSelectedCell{
playPauseRunTime(state: "Pause")
playPauseRunTime(state: "Play")
let row = indexPathOfSelectedCell.row + 1
let newIndexPath = IndexPath(row: row, section: 0)
self.indexPathOfSelectedCell = newIndexPath
delegate?.indexPathOfSelectedCell = newIndexPath
let newCell = self.tableView!.cellForRow(at: newIndexPath) as? PlayableAudioCell
updateWithObserver(cell: newCell!)
updateFooterView()
self.tableView!.reloadData()
}
}
}
最佳答案
显然,AVQueuePlayer 每次完成播放队列中的项目时都会删除 AVPlayerItem。我的逻辑是尝试将队列的索引与 TableView 单元格的数组相匹配,经过几次迭代后,索引将关闭,并且观察者不会添加到正确的玩家项目中。通过用 AVPlayer 和 AVPlayerItems 数组替换 AVQueuePlayer 来修复。
关于ios - 以某种方式生成 AVPlayerItem 的副本而不是访问引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46819887/
我对 AVPlayer.timeControlStatus 属性进行 KVO 处理,播放器有一个 AVPlayerItem。 该视频是托管在远程服务器上的 mpeg4 编码的 10 秒视频文件: le
我有一个崩溃影响了我大约 10% 的用户,但我无法重现它,并且不知道发生这种情况的确切时间。 Crashlytics 报告说,大约一半的崩溃用户没有关注应用程序,即做背景音频或 AirPlay。该应用
我一直收到这个错误: 'An AVPlayerItem can occupy only one position in a player's queue at a time.' 我对玩家项目进行了 N
我正在使用 AVPlayer 播放流式网络音频。我观察流项目的状态如下: ios avplayer trigger streaming is out of buffer 工作看起来不错,但我遇到了一个
这段代码在iOS 12上崩溃,并带有无法识别的选择器异常: [AVPlayerItem externalMetadata]: unrecognized selector sent to instanc
我正在使用 AVQueuePlayer 在我们的应用程序中播放视频列表。我正在尝试缓存 AVQueuePlayer 播放的视频,这样就不必每次都下载视频。 因此,在视频播放完毕后,我尝试将 AVPla
我收到警报消息“无法解码。此媒体所需的解码器正忙。”当尝试在应用程序中第五次播放视频文件时。搜索后我发现AVPlayerItem fails with AVStatusFailed and error
我正在使用“initWithUrl:”方法初始化 AVPlayerItem。 问题是当初始化中断时(例如连接丢失) 假设我们有以下内容: self.avPlayerItem = [[AVPlayerI
刚刚发现一个很奇怪的问题, 从本地存储加载 mp3 文件时, avplayeritem一直处于未知状态,如果文件放在文件夹中则无法播放。 方式一: //AVAsset *asset = [[AVURL
我正在使用 AVPlayer,它通过 AVPlayerItem 连接到远程 URL。问题是我想立即播放来自 URL 的声音,不要让用户等待 AVPlayer 缓冲。 问题在于,如果远程 URL 的 A
我知道当使用 AVQueuePlayer 播放 AVPlayerItem 对象列表时,播放器会预加载队列中的下一个项目,以便在用户到达该项目时更快地重新加载。 问题是我需要对预加载哪些项目有更多的控制
我看过many questions对此,没有人有解决方案。我得到: An AVPlayerItem can occupy only one position in a player's queue a
尝试从我的临时目录播放视频时出现此错误: NSString *tmpDir = [NSTemporaryDirectory() stringByAppendingString:@"/"]; NSStr
如果我使用 KVO 来观察我的播放器项目,如下所示: AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url];
我正在使用 AVPlayer 播放 AVMutableVideoComposition 并且从 IOS8 开始一切都很好。 但是现在视频开始播放,在 4 或 5 秒后停止,比如缓冲或类似的东西,声音继
我目前正在使用 AVPlayerItem 从 URL 播放实时流。我的代码是 - (void)viewDidLoad { AVPlayerItem* playerItem = [AVPlaye
我在我的应用程序中使用 AVQueuePlayer,我需要一个数组,其中包含类型为 [AVPlayerItem] 的轨道。每次 TableView 加载时都必须创建数组。我还有一个包含当前文件夹中元素
我有一个缓存类,它将 MP3 文件下载到某个缓存文件夹并将其命名为 xxxx.cache 我有一个加载 MP3 文件的 AVQueuePlayer。从我的 NSBundle Resources 文件夹
我有一个使用 AVQueuePlayer 对象的简单音频播放列表。通过迭代包含自定义 UITableViewCell 对象 PlayableAudioCell 的 UITableView 来填充队列。
我正在开发一个播放音频文件或流媒体的应用程序,遇到了一个我无法解决的问题。基本上我的 AVPlayer 在当前项目发生故障后不再播放新项目。下面是一个快速应用程序,您可以复制/粘贴以进行复制。 imp
我是一名优秀的程序员,十分优秀!