MPNowPlayingInfoCenter 信息无法通过 USB 配件使用

MPNowPlayingInfoCenter info doesn't work via USB accessory

我有一个应用程序使用 AVPlayer(实际上是 AVQueuePlayer)来播放音频。它设置 MPNowPlayingInfoCenter 信息,使用 MPRemoteCommandCenter 管理远程命令,并允许背景音频。所有这些功能都可以通过控制中心和锁定屏幕正常运行。当我把我的 phone 带进我的车时,它也能与我的车的蓝牙接口正常工作。但是,如果我通过 iPhone 6 闪电端口将 phone 直接插入我的汽车音响,它就会坏得很厉害。它确实会播放音频,但是...

(1) None 的正在播放的信息显示在我的汽车仪表板上 (2) 每当我尝试做任何事情时,我的汽车音响都会出现一堆连接错误。

我 phone 上的其他应用程序没有这个问题,所以我不认为这是我的立体声音响的问题。我用的是官方的 Apple Lightning 数据线,所以这也没有关系。

我通过我的 Apple TV 试用了我的应用程序和 AirPlay,它同样不稳定。我注意到 AVPlayer 有一个重要的 属性 叫做 allowsExternalPlayback,如果您只播放音频,则需要将其设置为 NO。将 属性 设置为 NO 后,通过 Apple TV 的 AirPlay 可以正常工作。我认为这与影响我的汽车的问题相同,但情况似乎并非如此。即使 allowsExternalPlayback 设置为 NO,在我的车上通过 USB 连接播放音频仍然是错误的。

(a) AVAudioSession 或 (b) AVPlayer 的配置似乎有问题。

我的音频播放器配置很简单...

self.audioQueue = [AVQueuePlayer queuePlayerWithItems:nil];
self.audioQueue.allowsExternalPlayback = NO;

[self.audioQueue addObserver:self forKeyPath:@"status" options:0 context:kAVPlayerStatusContext];
[self.audioQueue addObserver:self forKeyPath:@"rate" options:0 context:kAVPlayerRateContext];
[self.audioQueue addObserver:self forKeyPath:@"error" options:0 context:kAVPlayerErrorContext];
[self.audioQueue addObserver:self forKeyPath:@"currentItem" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:kAVPlayerCurrentItemContext];

...在我的音频会话中...

AVAudioSession *audioSession = [AVAudioSession sharedInstance];

NSError *error;
[audioSession setActive:YES error:&error];
// Error handling code

[audioSession setCategory:AVAudioSessionCategoryPlayback error:&error];
// Error handling code

// Audio session notifications
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self selector:@selector(audioSessionInterruptionNotification:) name:AVAudioSessionInterruptionNotification object:audioSession];
[defaultCenter addObserver:self selector:@selector(audioSessionRouteChangeNotification:) name:AVAudioSessionRouteChangeNotification object:audioSession];
[defaultCenter addObserver:self selector:@selector(audioSessionMediaServicesWereResetNotification:) name:AVAudioSessionMediaServicesWereResetNotification object:audioSession];

是否需要设置其他属性来处理此用例?我能做些什么来调试这里发生的事情?这个让我明白了。

这里有 2 个问题...

  1. 我设置 MPNowPlayingInfoPropertyPlaybackQueueIndex 的方式与设置 MPMediaItemPropertyAlbumTrackCount 的方式相同。看了文档,才发现MPNowPlayingInfoPropertyPlaybackQueueIndex是从零开始的,我一直把queue index设置为1,queue count设置为1,导致汽车音响根本不显示任何信息。

  2. 要使用 AVPlayer 播放曲目,您只需将速率设置为 0 以外的值即可。我注意到我对 [audioQueue play] 进行了不必要的调用,对吧在我将速率设置为我的播放速率之前。我删除了那个不必要的播放调用,它解决了我的其他问题。出于某种原因,那个电话的效果是在我按下暂停按钮后,汽车音响立即发送播放命令。