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 没有正确反应

MPNowPlayingInfoCenter 在音频流停止时消失

如何在 Swift 3 中正确设置 MPNowPlayingInfoCenter