• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - MPNowPlayingInfoCenter 抛出 EXC_BAD_ACCESS

[复制链接]
菜鸟教程小白 发表于 2022-12-12 22:10:16 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在制作一个播放音频的应用程序,我已经对其进行了设置,以便通过 MPNowPlayingInfoCenter 更新锁定屏幕,但我遇到了问题。

在尝试更新正在播放的信息时,有时会出现 EXC_BAD_ACCESS 错误。

这是执行此操作的代码:

- (void)updatePlayback
{
    if(!active)
        return;

    NowPlayingController* npc = [AudioController nowPlayingController];
    CMTime elapsed = player.currentTime;
    Float64 elInterval = CMTimeGetSeconds(elapsed);
    [npc setElapsed:elInterval];

    CMTime duration = player.currentItem.duration;
    Float64 durInterval = CMTimeGetSeconds(duration);
    [npc setRemaining:ceilf(durInterval - elInterval)];

    [npc setPlayPauseValue:isPlaying];
    if(durInterval > 0)
    {
        [npc setProgressValue:elInterval/durInterval];
        [npc setAudioDuration:durInterval];
    }

    _activeMetadata[MPMediaItemPropertyPlaybackDuration] = @(durInterval);
    _activeMetadata[MPNowPlayingInfoPropertyPlaybackRate] = @(isPlaying);
    _activeMetadata[MPNowPlayingInfoPropertyElapsedPlaybackTime] = @(elInterval);

    MPNowPlayingInfoCenter* npInfoCenter = [MPNowPlayingInfoCenter defaultCenter];
    if(npInfoCenter && _activeMetadata)
    {
        if([npInfoCenter respondsToSelectorselector(setNowPlayingInfo])
        {

//////////THE FOLLOWING LINE TRIGGERS EXC_BAD_ACCESS SOMETIMES////////////
            [npInfoCenter setNowPlayingInfo:_activeMetadata];
        }

    }
}

99.9% 的情况下,这是可行的,但有时在将应用程序退出后台或更改音频文件时,或者只是随机地,

[npInfoCenter setNowPlayingInfo:_activeMetadata];

抛出 EXC_BAD_ACCESS

另外,_activeMetadata 被声明为:

@property (atomic, strong, retain) NSMutableDictionary* activeMetadata;

在创建 AVPlayer 时实例化:

    AVAsset* asset = [AVAsset assetWithURL:[NSURL fileURLWithPath:path]];
    AVPlayerItem* playerItem = [AVPlayerItem playerItemWithAsset:asset];
    player = [AVPlayer playerWithPlayerItem:playerItem];

    CMTime duration = player.currentItem.duration;
    NSTimeInterval durInterval = CMTimeGetSeconds(duration);
    NSLog(@"%f", durInterval);

    MPMediaItemArtwork* albumArtwork = [[MPMediaItemArtwork alloc] initWithImage:[downloader useCachedImage:CacheKeySeriesBanners withName:nil withURL:info[@"image"]]];
    NSDictionary* nowPlayingInfo = @{MPMediaItemPropertyTitle:ptString,
                                     MPMediaItemPropertyArtist:spString,
                                     MPMediaItemPropertyArtwork:albumArtwork,
                                     MPMediaItemPropertyAlbumTitle:info[@"title"],
                                     MPMediaItemPropertyPlaybackDuration(durInterval),
                                     MPNowPlayingInfoPropertyPlaybackRate(1),
                                     MPNowPlayingInfoPropertyElapsedPlaybackTime(0)};
    [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:nowPlayingInfo];

    _activeMetadata = [nowPlayingInfo mutableCopy];

updatePlayback 在每一帧通过 CADisplayLink 调用。

任何想法可能导致异常?



Best Answer-推荐答案


我认为您过于频繁地调用 setNowPlayingInfo。当然,它确实不应该崩溃,但没有必要使用 CADisplayLink 每秒调用 60 次。

那你为什么这么频繁地调用它?如果是因为你想让进度条跟踪流畅,还是没有必要的。从 MPNowPlayingInfoPropertyElapsedPlaybackTime 声明:

// The elapsed time of the now playing item, in seconds.
// Note the elapsed time will be automatically extrapolated from the previously 
// provided elapsed time and playback rate, so updating this property frequently
// is not required (or recommended.)

附言我用 m4a 文件尝试了代码,发现 durInterval 是 NotANumber。使用正确的持续时间并仅调用一次 setNowPlayingInfo,进度条跟踪良好且没有崩溃。

关于ios - MPNowPlayingInfoCenter 抛出 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39555416/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap