【发布时间】:2013-04-29 10:41:30
【问题描述】:
我是 IOS 开发新手。我正在尝试使用 AVAudioRecorder 在后台录制用户语音,但我将“音频”添加到 UIBackgroundModes 但这没有帮助。顺便说一句,一切都在前台工作完美。当在后台时,计时器工作正常,但没有录音。 如何从背景的麦克风录制?这可能吗?
【问题讨论】:
-
请添加一些信息,你是如何尝试的(最好是一些代码)
标签: objective-c xcode
我是 IOS 开发新手。我正在尝试使用 AVAudioRecorder 在后台录制用户语音,但我将“音频”添加到 UIBackgroundModes 但这没有帮助。顺便说一句,一切都在前台工作完美。当在后台时,计时器工作正常,但没有录音。 如何从背景的麦克风录制?这可能吗?
【问题讨论】:
标签: objective-c xcode
你可以。 Skype 会这样做。
您大概需要在 Info.plist 中设置<key>UIBackgroundModes</key><array><string>audio</string></array>,并且您需要确保在切换应用程序之前音频会话处于活动/运行/任何状态(假设您不会突然开始录制/播放音乐/无论您的应用何时在后台运行)。
The docs 说“音频”可以让您在后台播放音频,但大概这也适用于录制音频。如果它不起作用,您可以尝试一些方法:
此素材来自这里:iOS multitasking for an Audio Recording application
额外材料见:he recording stops as soon as I press the "HOME" button Building Background-Aware Applications
【讨论】:
您需要在应用程序 plist 文件中将 UIBackgroundModes 设置为音频。
【讨论】:
是的,当应用程序在后台运行时,可以同时录制和播放。首先,您需要为您的应用启用后台模式,请使用以下步骤。
-- 在 Xcode 的 Navigator 中选择您的项目文件。然后,从 Capabilities 部分,打开 Background Modes 子部分。在为您提供背景模式列表后,勾选 Audio & Airplay 开关。
-- 使用以下代码在应用程序的前台和后台状态下录制和播放音频。如果设备处于静音模式或用户锁定设备,下面的代码还会录制和播放音频。
import UIKit
import AVFoundation
extension String {
func stringByAppendingPathComponent(path: String) -> String {
let nsSt = self as NSString
return nsSt.stringByAppendingPathComponent(path)
}
}
class ViewController: UIViewController, AVAudioPlayerDelegate, AVAudioRecorderDelegate{
var audioPlayer : AVAudioPlayer!
var audioRecorder : AVAudioRecorder!
@IBOutlet var recordButton : UIButton!
@IBOutlet var playButton : UIButton!
@IBOutlet var stopButton : UIButton!
override func viewDidLoad() {
super.viewDidLoad()
self.recordButton.enabled = true
self.playButton.enabled = false
self.stopButton.enabled = false
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
//MARK: UIButton action methods
@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)")
}
}
});
}
@IBAction func stopButtonClicked(sender : AnyObject){
if let player = self.audioPlayer{
player.stop()
}
if let record = self.audioRecorder{
record.stop()
}
let session = AVAudioSession.sharedInstance()
do{
try session.setActive(false)
}
catch{
print("\(error)")
}
}
@IBAction func recordButtonClicked(sender : AnyObject){
let session = AVAudioSession.sharedInstance()
do{
try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
try session.setActive(true)
session.requestRecordPermission({ (allowed : Bool) -> Void in
if allowed {
self.startRecording()
}
else{
print("We don't have request permission for recording.")
}
})
}
catch{
print("\(error)")
}
}
func startRecording(){
self.playButton.enabled = false
self.recordButton.enabled = false
self.stopButton.enabled = true
do{
let fileURL = NSURL(string: self.audioFilePath())!
self.audioRecorder = try AVAudioRecorder(URL: fileURL, settings: self.audioRecorderSettings() as! [String : AnyObject])
if let recorder = self.audioRecorder{
recorder.delegate = self
if recorder.record() && recorder.prepareToRecord(){
print("Audio recording started successfully")
}
}
}
catch{
print("\(error)")
}
}
func audioFilePath() -> String{
let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0]
let filePath = path.stringByAppendingPathComponent("test.caf") as String
//let filePath = NSBundle.mainBundle().pathForResource("mySong", ofType: "mp3")!
return filePath
}
func audioRecorderSettings() -> NSDictionary{
let settings = [AVFormatIDKey : NSNumber(int: Int32(kAudioFormatMPEG4AAC)), AVSampleRateKey : NSNumber(float: Float(16000.0)), AVNumberOfChannelsKey : NSNumber(int: 1), AVEncoderAudioQualityKey : NSNumber(int: Int32(AVAudioQuality.Medium.rawValue))]
return settings
}
//MARK: AVAudioPlayerDelegate methods
func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
if flag == true{
print("Player stops playing successfully")
}
else{
print("Player interrupted")
}
self.recordButton.enabled = true
self.playButton.enabled = false
self.stopButton.enabled = false
}
//MARK: AVAudioRecorderDelegate methods
func audioRecorderDidFinishRecording(recorder: AVAudioRecorder, successfully flag: Bool) {
if flag == true{
print("Recording stops successfully")
}
else{
print("Stopping recording failed")
}
self.playButton.enabled = true
self.recordButton.enabled = false
self.stopButton.enabled = false
}
}
只需复制此代码并将其粘贴到空视图控制器 swift 文件中,在 xib 文件或故事板文件中创建三个按钮“记录”、“停止”、“播放”,连接@IBOutlet 和@IBAction。 在真实设备上测试此代码,因为您需要麦克风来录制音频。 我已经针对 xCode 7 和 iOS 9 及其工作进行了测试。
【讨论】: