在设备锁定时播放 iPod 库中的音频

Posted

技术标签:

【中文标题】在设备锁定时播放 iPod 库中的音频【英文标题】:Playing AVAudio from iPod Library while device is locked 【发布时间】:2012-07-17 04:07:13 【问题描述】:

只是一个简单的问题。

我已将我的程序设置为能够在后台播放AVAudioPlayerAVPlayer,这工作正常。我可以播放歌曲,锁定屏幕,声音会继续播放。

我遇到的问题是在我的屏幕已经锁定时拨打[AVPlayer play]。这最终导致没有音乐被播放。

【问题讨论】:

我知道答案已经被选中,所以你的问题已经解决了,但是我无法理解你的程序在屏幕已经锁定的情况下是如何运行的。 @DevinGund 这是通过在您的 .plist 文件中指定“必需的后台模式”来告诉 ios 应该允许应用程序播放音频,即使它不在前台。 @MDT 是的,所以当您关闭应用程序时,音频将继续运行,但当设备被锁定时,您的应用程序不会运行。那么如果设备已经锁定,它如何告诉 iOS 播放歌曲呢? @DevinGund 我想我明白你在说什么,我确定 iOS 只是在监听最近调用播放会话的应用程序并自动触发此应用程序控制事件。 @DevinGund 我不太确定你想说什么。我的意思是让我的应用程序继续运行,然后当它自动锁定或用户按下锁定按钮时,我希望我的声音在预先指定的时间播放。我希望这能解决问题。 【参考方案1】:

你需要告诉你的播放器监听控制事件:

- (void)viewDidAppear:(BOOL)animated 
    [super viewDidAppear:animated];

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self becomeFirstResponder];

- (BOOL)canBecomeFirstResponder 
    return YES;

- (void)viewWillDisappear:(BOOL)animated 
    [super viewWillDisappear:animated];
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
    [self resignFirstResponder];

然后你可以像这样对它们采取行动:

- (void)remoteControlReceivedWithEvent:(UIEvent *)event 
    if (event.type == UIEventTypeRemoteControl) 
        
        if (event.subtype == UIEventSubtypeRemoteControlPlay) 
            
            [AVPlayer play];
             

        else if (event.subtype == UIEventSubtypeRemoteControlPause) 
            
            [AVPlayer pause];
             
        else if (event.subtype == UIEventSubtypeRemoteControlTogglePlayPause) 
            
                if (!AVPlayer.playing) 
                    
                        [AVPlayer play];

                     else if (AVPlayer.playing) 
                    
                        [AVPlayer pause];
                    
            
        else if (event.subtype == UIEventSubtypeRemoteControlNextTrack)
            
            [self myNextTrackMethod];
            
        else if (event.subtype == UIEventSubtypeRemoteControlPreviousTrack)
            
            [self myLastTrackMethod];
            
        

【讨论】:

非常感谢,这太完美了,回复时间也太棒了!我怎样才能选择你的作为接受的答案? @DejanLukić 看起来你已经想通了!乐意效劳!我已经对我的答案进行了编辑,这应该可以更好地满足您的需求。 完美无瑕!事实上,比我需要的还要多。再次感谢! @DejanLukić 没问题,如果您正在考虑添加下一首/最后一首曲目功能,可以通过创建曲目名称数组并告诉您的下一个/最后一个方法播放 objectAtIndex 轻松完成数组并从中添加或减去以在歌曲之间导航。 谢谢,这将在未来派上用场,因为我在这方面看到的所有示例都比您刚刚描述的要困难得多,但目前我只需要一种声音即可用作警报。关于您的答案/cmets 最好的一点是没有过于复杂的块,谢谢大家!

以上是关于在设备锁定时播放 iPod 库中的音频的主要内容,如果未能解决你的问题,请参考以下文章

修改 SpeakHere 以录制设备上播放的音频

您可以播放 iPod 库中的视频吗?

如何在播放时处理 ipod 库音频文件原始数据

同时录制音频和播放 iPod?

音频设备测试无法播放声音

MPMoviePlayerController 中断 AirPlay iPod 音频,但在设备上工作正常