26

使用 OpenFrameworks 为 iOS 设计一个生成音乐系统,我需要提供一种模式,用户可以在以下情况下收听应用程序生成的音乐:

  • 设备已锁定
  • 用户使用另一个应用程序

一些应用程序,如 BLOOM 或闹钟,就是这样工作的,并向用户建议启用/禁用此功能的开关。

有什么建议吗?

4

6 回答 6

35

播放背景音频

连续播放或录制音频的应用程序(即使应用程序在后台运行时)可以注册以在后台执行这些任务。您可以从 Xcode 项目的 Capabilities 选项卡的 Background mode 部分启用音频支持。(您还可以通过在应用程序的 Info.plist 文件中包含带有音频值的 UIBackgroundModes 键来启用此支持。)在后台播放音频内容的应用程序必须播放可听内容而不是静音。

Apple 参考“播放和录制背景音频”

确保屏幕锁定时音频继续播放

为了启用/禁用此功能,我发现Activating and Deactivating Your Audio Session,我自己没有尝试过,但它看起来像你需要的。

于 2012-05-03T13:33:20.020 回答
29

您需要在 plist 文件中进行一些更改。

即 1) 将所需的后台模式设置为 App 播放音频

2)将应用程序不在后台运行设置为NO。

 NSError *setCategoryErr = nil;
 NSError *activationErr  = nil;
 [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];
 [[AVAudioSession sharedInstance] setActive:YES error:&activationErr];

然后,你需要在 AppDelegate 中编写这么多代码

现在,您可以在手机屏幕锁定或进入后台时轻松运行音频。

于 2013-02-01T07:21:16.203 回答
3

在 xCode 项目设置和代码中进行以下更改。

步骤 1) 在 Xcode 的 Navigator 中选择您的项目文件。然后,从 Capabilities 部分,打开 Background Modes 子部分。在为您提供背景模式列表后,勾选音频和 Airplay 开关。

stp 2) 使用以下 swift 代码,基本上你需要为你的应用设置音频会话。

var audioPlayer : AVAudioPlayer!

@IBAction func playButtonClicked(sender : AnyObject){

    let dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
    dispatch_async(dispatchQueue, {

        if let data = NSData(contentsOfFile: self.audioFilePath())
        {
            do{
                let session = AVAudioSession.sharedInstance()

                try session.setCategory(AVAudioSessionCategoryPlayback)
                try session.setActive(true)

                self.audioPlayer = try AVAudioPlayer(data: data)
                //self.audioPlayer.delegate = self
                self.audioPlayer.prepareToPlay()
                self.audioPlayer.play()
            }
            catch{
                print("\(error)")
            }
        }
    });
}

func audioFilePath() -> String{

    let filePath = NSBundle.mainBundle().pathForResource("mySong", ofType: "mp3")!
    return filePath
}

此音频播放会话将播放您的应用程序播放,即使应用程序处于后台或手机处于静音模式或设备已锁定。

于 2015-10-27T18:02:00.183 回答
1

看看这个教程。它有一些后台服务示例

http://www.raywenderlich.com/29948/backgrounding-for-ios

于 2015-11-18T07:43:06.457 回答
0

您需要在 plist 文件中进行一些更改。

1) 将必需的后台模式设置为应用播放音频

2)将应用程序不在后台运行设置为NO。

let dispatchQueue = DispatchQueue.global()
            dispatchQueue.async(execute: {
                    do{
                        let session = AVAudioSession.sharedInstance()

                        try session.setCategory(AVAudioSessionCategoryPlayback)
                        try session.setActive(true)

                        self.isObjectAllocate = true
                        if self.isPlayed == false{
                            self.playSound(soundName: "http://radio.zahraun.com:8000/live.m3u")
                            self.isPlayed = true
                            self.btnPlayAudio.setImage(#imageLiteral(resourceName: "pause") , for: .normal)

                        }else{
                            self.audioPlayer.pause()
                            self.isPlayed = false
                            self.btnPlayAudio.setImage(#imageLiteral(resourceName: "audioPlay"), for: .normal)
                        }
                    }
                    catch{
                        print("\(error)")
                    }
            });
于 2017-03-17T08:19:12.483 回答
-2

您也可以使用以下代码:

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:NULL];

AVAudioSession *backgroundMusic = [AVAudioSession sharedInstance];

[backgroundMusic setCategory:AVAudioSessionCategoryPlayback error:NULL];
于 2013-05-23T08:39:01.070 回答