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 个问题...
我设置 MPNowPlayingInfoPropertyPlaybackQueueIndex
的方式与设置 MPMediaItemPropertyAlbumTrackCount
的方式相同。看了文档,才发现MPNowPlayingInfoPropertyPlaybackQueueIndex
是从零开始的,我一直把queue index设置为1,queue count设置为1,导致汽车音响根本不显示任何信息。
要使用 AVPlayer
播放曲目,您只需将速率设置为 0 以外的值即可。我注意到我对 [audioQueue play]
进行了不必要的调用,对吧在我将速率设置为我的播放速率之前。我删除了那个不必要的播放调用,它解决了我的其他问题。出于某种原因,那个电话的效果是在我按下暂停按钮后,汽车音响立即发送播放命令。
我有一个应用程序使用 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 个问题...
我设置
MPNowPlayingInfoPropertyPlaybackQueueIndex
的方式与设置MPMediaItemPropertyAlbumTrackCount
的方式相同。看了文档,才发现MPNowPlayingInfoPropertyPlaybackQueueIndex
是从零开始的,我一直把queue index设置为1,queue count设置为1,导致汽车音响根本不显示任何信息。要使用
AVPlayer
播放曲目,您只需将速率设置为 0 以外的值即可。我注意到我对[audioQueue play]
进行了不必要的调用,对吧在我将速率设置为我的播放速率之前。我删除了那个不必要的播放调用,它解决了我的其他问题。出于某种原因,那个电话的效果是在我按下暂停按钮后,汽车音响立即发送播放命令。