- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在播放器(缓冲或加载)和开始播放时停止显示 ActivityIndicator
。此外,当我停止播放器时,它是 AVPlayer 的(removeObserver 或 deallocObservers)。当我播放音乐时,它会显示 ActivityIndicator
直到它准备好播放,但它会在播放前 4.5 秒停止动画 ActivityIndicator`。问题是当我停止 AVPlayer 或点击另一个播放按钮时,它在删除 AVPlayer 观察器时给我错误。任何人都可以告诉我我的代码中哪里有错误以及我该如何解决,谢谢。
var selectIndex:Int = -1
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell{
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! RadioCollectionViewCell
cell.backgroundColor = UIColor.yellowColor()
let object = objects[indexPath.row]
cell.img.image = UIImage(named: object["image"]!)
cell.btnPlay.addTarget(self, action: Selector("audioControlButtonAction:"), forControlEvents: UIControlEvents.TouchUpInside)
cell.btnPlay.tag = indexPath.row+1
return cell
}
func audioControlButtonAction(sender: UIButton){
if player != nil && player?.currentItem != nil {
deallocObservers(player!)
}
var btn:NSInteger
btn = sender.tag as NSInteger
let object = objects[btn-1]
let nurl = NSURL(string: "\(object["url"]!)")!
playerItem = AVPlayerItem(URL: nurl)
player=AVPlayer(playerItem: playerItem!)
print(selectIndex)
if selectIndex != -1 && selectIndex != sender.tag
{
let bt:UIButton = self.view.viewWithTag(selectIndex) as! UIButton
if bt.selected == true
{
bt.selected = false
deallocObservers(player!)
}
}
if sender.selected == false
{
player!.addObserver(self, forKeyPath: "status", options:NSKeyValueObservingOptions(), context: nil)
player!.addObserver(self, forKeyPath: "playbackBufferEmpty", options:NSKeyValueObservingOptions(), context: nil)
// player!.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options:NSKeyValueObservingOptions(), context: nil)
player!.addObserver(self, forKeyPath: "loadedTimeRanges", options: NSKeyValueObservingOptions(), context: nil)
player!.play()
sender.selected = true
selectIndex = sender.tag
activityView.startAnimating()
// self.view.userInteractionEnabled = false
}
else
{
deallocObservers(player!)
player?.pause()
sender.selected = false
selectIndex = -1
}
print(selectIndex)
}
func deallocObservers(player: AVPlayer) {
player.removeObserver(self, forKeyPath: "status")
player.removeObserver(self, forKeyPath: "playbackBufferEmpty")
// player.removeObserver(self, forKeyPath: "playbackLikelyToKeepUp")
player.removeObserver(self, forKeyPath: "loadedTimeRanges")
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>){
if object?.isEqual(player) == true && keyPath == "status" {
print("status")
if player?.status == AVPlayerStatus.ReadyToPlay{
print("AVPlayerStatus.ReadyToPlay")
activityView.stopAnimating()
// self.view.userInteractionEnabled = true
}else{
print("AVPlayerStatus.NotReadyToPlay")
activityView.startAnimating()
// self.view.userInteractionEnabled = false
}
//if keyPath == "playbackLikelyToKeepUp" {
//activityView.stopAnimating()
////self.view.userInteractionEnabled = true
//print("playbackLikelyToKeepUp")
//}
if keyPath == "playbackBufferEmpty" {
activityView.startAnimating()
self.view.userInteractionEnabled = false
let createAccountErrorAlert: UIAlertView = UIAlertView()
createAccountErrorAlert.delegate = self
createAccountErrorAlert.title = "No Internet Connection"
createAccountErrorAlert.message = "Make sure your device is connected to the internet."
createAccountErrorAlert.addButtonWithTitle("Dismiss")
createAccountErrorAlert.show()
print("playbackBufferEmpty")
}
if player?.status == AVPlayerStatus.Failed{
print("Something went wrong . player.error should contain some information")
}
}
}
Output
-1
1
status
AVPlayerStatus.ReadyToPlay
1
2016-07-24 21:51:00.585 Radio[777:23560] *** Terminating app due to uncaught exception 'NSRangeException', reason: 'Cannot remove an observer <Radio.RadioCollectionViewController 0x7fbe39d47f70> for the key path "status" from <AVPlayer 0x7fbe39e67410> because it is not registered as an observer.'
*** First throw call stack:
(
0 CoreFoundation 0x00000001019b2e65 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000103b51deb objc_exception_throw + 48
2 CoreFoundation 0x00000001019b2d9d +[NSException raise:format:] + 205
3 Foundation 0x0000000101fc4d51 -[NSObject(NSKeyValueObserverRegistration) _removeObserver:forProperty:] + 504
4 Foundation 0x0000000101fc4abd -[NSObject(NSKeyValueObserverRegistration) removeObserver:forKeyPath:] + 84
5 Radio 0x00000001014a935d _TFC5Radio29RadioCollectionViewController16deallocObserversfS0_FCSo8AVPlayerT_ + 141
6 Radio 0x00000001014a8fbe _TFC5Radio29RadioCollectionViewController24audioControlButtonActionfS0_FCSo8UIButtonT_ + 5326
7 Radio 0x00000001014a92ba _TToFC5Radio29RadioCollectionViewController24audioControlButtonActionfS0_FCSo8UIButtonT_ + 58
8 UIKit 0x0000000102630194 -[UIApplication sendAction:to:from:forEvent:] + 92
9 UIKit 0x000000010279f6fc -[UIControl sendAction:to:forEvent:] + 67
10 UIKit 0x000000010279f9c8 -[UIControl _sendActionsForEvents:withEvent:] + 311
11 UIKit 0x000000010279eaf8 -[UIControl touchesEnded:withEvent:] + 601
12 UIKit 0x000000010269f49b -[UIWindow _sendTouchesForEvent:] + 835
13 UIKit 0x00000001026a01d0 -[UIWindow sendEvent:] + 865
14 UIKit 0x000000010264eb66 -[UIApplication sendEvent:] + 263
15 UIKit 0x0000000102628d97 _UIApplicationHandleEventQueue + 6844
16 CoreFoundation 0x00000001018dea31 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
17 CoreFoundation 0x00000001018d495c __CFRunLoopDoSources0 + 556
18 CoreFoundation 0x00000001018d3e13 __CFRunLoopRun + 867
19 CoreFoundation 0x00000001018d3828 CFRunLoopRunSpecific + 488
20 GraphicsServices 0x0000000106247ad2 GSEventRunModal + 161
21 UIKit 0x000000010262e610 UIApplicationMain + 171
22 Radio 0x00000001014afd5d main + 109
23 libdyld.dylib 0x000000010468892d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
我找到了从此链接中删除 status observer
的解决方案,但不知道如何快速转换它。
Solution
@try { [player removeObserver:self forKeyPath:@"status"]; } @catch (NSException *exception) { } @finally { } –
最佳答案
快速版本
Objective-C
@try { [player removeObserver:self forKeyPath:@"status"]; } @catch (NSException *exception) { } @finally { }
swift
do {
try player.removeObserver(self, forKeyPath: "status")
}
catch {
print("error")
}
defer{
print("finally statement here")
}
关于ios - 在 AVPlayer 上添加 ActivityIndicator 并删除 addObserver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38554569/
我有一个 AVPlayer当我到达持续时间结束时,我想回到开始,但我不想重新启动AVPlayer . //Do something when video ended NotificationCente
我正在使用 AVPlayer 从服务器流式传输音频,我现在想做的是显示一个显示缓冲进度的自定义 UISlider。 有人想出这个吗?请给我解决方案。现在播放器一次加载整个持续时间并在 UISlider
我知道 AVPlayerItem(AVPlayer 的子类)能够订阅 AVPlayerItemDidPlayToEndTimeNotification AVPlayer 没有这样的功能,我需要使用 A
总结: 如果您只使用 AVPlayer 在您的应用程序中播放流音频,那么锁屏更新将工作得很好(许多流 - 一个接一个)。但是,如果您使用 AVPlayer 播放流式音频,然后播放本地视频文件(即使在使
我正在尝试创建像 Vine 这样的应用程序。我有一个 Collection View ,其中每个项目都包含一个带有 AVPlayerLayer 和 AVPlayer 实例的 View ,并且相应的 a
我创建了一个简单的 AVPlayer。 (如果我没有正确创建它,请帮我修复它...😀)我想用 swift ui 在我的 VStack 中显示它,但我有点卡住了... 如果库里至少有AVPlayer
我已将观察者添加到 AVPlayer,但它不会在 avplayer 状态准备好播放时调用该函数。该函数在视频开始播放时调用两次,但 AVPlayer 的持续时间参数都返回“nan”,我需要在 AVPl
我有 2 个 View Controller ,第一个包含一个视频信息列表表,然后从列表中选择一个项目,通过导航打开详细 View Controller 。我在这个细节 Controller 上使用了
关于这个主题的所有线程都非常老(5+ 哟),我似乎无法形成一个清晰的现代方法,所以希望这可以在 2020 年(Swift 5,Xcode 11)进行总结。 如果您要使用 为 iPhone 构建一个 A
我有一个 AVPlayer 可以从网络流式传输 mp3 文件。我已经激活了一个 AVAudioSession 以便在应用程序退出/屏幕关闭时播放音频。音乐播放完美,但手机顶部状态菜单中出现的“播放”三
我正在使用 Apple 的文档演示。这是演示链接: AVPlayerDemo 我的应用程序在执行以下步骤后崩溃了: 1) 播放歌曲 2) 从搜索栏快进。 3)点击下一步,4) 从搜索栏快进。 这是我的
因此看来,实际起作用的唯一值是0.0、0.5、1.0和2.0 ... 我尝试将其设置为0.25,因为我希望它以自然速度的1/4播放,但它却以自然速度的1/2播放。有人可以确认吗? 最佳答案 已确认。实
我有一个应用程序,它通过 AVMutableComposition 将本地文件加载到 avPlayer 中,它可能有多达 6 个音频和视频轨道作为合成的一部分。 我有一个 UISlider,用于调整播
在我的 IOS 应用程序中使用 AVPlayer 显示短视频的屏幕。我成功离开并重新进入此屏幕几次,但在七次或更多次后,我得到空白屏幕并且 AVPlayerLayer 的 IsReadyForDisp
我正在开发一个应用程序,其中包括使用每帧动画播放视频的功能。 您可以看到 example这样的功能。 我已经尝试添加 CAKeyFrameAnimation到 AVSynchronizedLayer
如何在 osx 自动播放中制作 avplayer? 我试过这个: NSURL *videoURL = [[NSBundle mainBundle] URLForResource:@"video nam
iOS AVPlayer 的默认最大和最小缓冲区大小是多少?如何增加 mp3 流媒体的大小?谢谢你 最佳答案 如果您的 缓冲区大小 意味着播放缓冲区,那么我相信这个大小没有记录。 此行为由 AVFou
我正在使用多个 AVPlayer 在我的屏幕上显示内容,并且它们都同时播放视频。 问题是有时 avplayer 正在播放,但 avplayerlayer 没有显示任何内容 - 你得到的只是一个空白屏幕
我正在使用 AVPlayer 在我的应用程序中播放视频,现在我想让视频在后台模式下播放。 这是我放入 - (BOOL)application:(UIApplication *)application
我在 iOS 6.1 中使用 AVPlayer 对象。我目前正在连接到 Icecast 服务器以传输现场音乐源。但是,当流由于任何原因(例如重新启动或信号更改)而中断时,AVPlayer 会停止播放。
我是一名优秀的程序员,十分优秀!