MPNowPlayingInfoCenter - 当音频暂停时,经过的时间不断计数
Posted
技术标签:
【中文标题】MPNowPlayingInfoCenter - 当音频暂停时,经过的时间不断计数【英文标题】:MPNowPlayingInfoCenter - elapsed time keeps counting when audio paused 【发布时间】:2013-12-22 17:05:53 【问题描述】:我目前正在尝试弄清楚如何在 ios 上的 MPNowPlayingInfoCenter
中指定经过的时间。
当我开始播放时,我将经过时间设置为 0,将播放速率设置为 1。这工作正常。
然后我暂停音频。 MPNowPlayingInfoCenter 可以正确检测到这一点,它会暂停接口上的已用时间。
只有当我恢复播放时才会出现问题:时间显示为暂停时继续播放。示例:
1. Start playback
2. Let it play for 10 seconds
3. Pause for 5 seconds
4. Resume playback
此时,轨迹中的实际时间为 10 秒。然而信息中心显示 15。
我尝试在暂停时将播放速率设置为 0,但这会导致奇怪的行为:显示的时间随机更改为较低的值。
另外,我真的没有机会更新在恢复歌曲之前经过的时间,因为我只有在收到play
事件后才有机会这样做。 p>
tl;dr:如何处理 MPNowPlayingInfoCenter 中的暂停及其时间功能?
【问题讨论】:
到这里寻找 macOS 上相同问题的解决方案。从 11.1 开始,我看到同样的问题随机发生,但只是想指出它也发生在 Safari 上(播放 Youtube 视频)。所以在这种情况下,它似乎是操作系统中的一个错误。 【参考方案1】:嗯,实际上将速率设置为 0,并在我暂停和播放时将时间重置为实际值。
【讨论】:
如何设置速率和时间? 通过MPNowPlayingInfoCenter的nowPlayingInfo
字典,在属性MPNowPlayingInfoPropertyPlaybackRate
上。详情见:developer.apple.com/library/ios/documentation/mediaplayer/…
当我将MPNowPlayingInfoPropertyPlaybackRate
设置为 0 时,锁定屏幕上的经过时间指示器会变回零。如果我在暂停和取消暂停时将MPNowPlayingInfoPropertyElapsedPlaybackTime
设置为当前经过的时间(除了将播放速率分别设置为 0 和 1),它似乎工作正常,但文档说不需要经常更新此属性。似乎应该有更好的方法来做到这一点。
您在问题中说“我尝试在暂停时将播放速率设置为 0,但这会导致奇怪的行为:显示的时间随机更改为较低的值”。但是您在回答时也说同样的话。你能解释一下吗?【参考方案2】:
好吧,我已经为 MPMoviePlayerPlaybackStateDidChangeNotification 通知添加了一个选择器。每当电影播放、暂停、向上/向下滑动信息中心(控制中心)时都会调用它。或者即使电影正在流式传输并且它会在收到响应时暂停/播放。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieStateChange)
name:MPMoviePlayerPlaybackStateDidChangeNotification
object:nil];
我愿意
- (void)movieStateChange
[self updateControlCenter];
这就是我的updateControlCenter,它需要已经初始化的播放信息并更新MPNowPlayingInfoPropertyElapsedPlaybackTime
键。
- (void)updateControlCenter
NSMutableDictionary *nowPlayingInfo = [center.nowPlayingInfo mutableCopy];
[nowPlayingInfo setObject:[NSNumber numberWithDouble:self.player.currentPlaybackTime] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
center.nowPlayingInfo = nowPlayingInfo;
祝你好运!
【讨论】:
【参考方案3】:我遇到了这个问题,并通过每次播放曲目时更新经过的时间来解决它。所以你的“播放”按钮应该更新信息
Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter");
if (playingInfoCenter)
NSMutableDictionary *songInfo = [[NSMutableDictionary alloc] init];
[songInfo setObject:currentTrack.trackTitle forKey:MPMediaItemPropertyTitle];
[songInfo setObject:currentTrack.artist forKey:MPMediaItemPropertyArtist];
[songInfo setObject:currentTrack.albumTitle forKey:MPMediaItemPropertyAlbumTitle];
[songInfo setObject:currentTrack.trackLength forKey:MPMediaItemPropertyPlaybackDuration];
[songInfo setObject:currentTime forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
【讨论】:
以上是关于MPNowPlayingInfoCenter - 当音频暂停时,经过的时间不断计数的主要内容,如果未能解决你的问题,请参考以下文章
MPNowPlayingInfoCenter:从 URL 设置 MPMediaItemArtwork 的最佳方法是啥?
MPNowPlayingInfoCenter - 当音频暂停时,经过的时间不断计数
MPNowPlayingInfoCenter 是不是与 AVAudioPlayer 兼容?
暂停播放时 MPNowPlayingInfoCenter 没有正确反应