AVAudioRecorder を使用してバックグラウンドでユーザーの声を録音しようとしていますが、UIBackgroundModes に「オーディオ」を追加しましたが、これは役に立ちません。ちなみに、フォアグラウンドではすべてが完璧に機能します。バックグラウンドではタイマーは正常に動作しますが、音声は録音されません。バックグラウンドでマイクから録音するにはどうすればよいですか? これは可能ですか?
3 に答える
あなたはできる。Skype がこれを行います。
おそらく<key>UIBackgroundModes</key><array><string>audio</string></array>
Info.plistで設定する必要があり、アプリを切り替える前に、オーディオセッションがアクティブ/実行中/その他であることを確認する必要があります(前提として、アプリがいつでも突然録音/音楽の再生を開始しないことを前提としています)背景にあります)。
ドキュメントによると、「オーディオ」を使用するとバックグラウンドでオーディオを再生できますが、おそらくこれはオーディオの録音にも当てはまります。うまくいかない場合は、次の方法を試してみてください。
- 「voip」と「audio」の両方を設定します。
- 無音を再生します (これは、Audio Queue API を使用するのが最も簡単かもしれません)。
ここからのこの資料:オーディオ録音アプリケーションの iOS マルチタスキング
余分な資料はこれを参照してください:彼は、「ホーム」ボタンを押すとすぐに録音を停止します バックグラウンド認識アプリケーションの構築
UIBackgroundModes
アプリケーションの plist ファイルでオーディオに設定する必要があります。
はい、アプリがバックグラウンドで実行されている場合、録音と再生の両方が可能です。まず、アプリのバックグラウンド モードを有効にする必要があります。以下の手順を使用します。
-- Xcode のナビゲータでプロジェクト ファイルを選択します。次に、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 ファイルまたはストーリーボード ファイルに "Record"、Stop"、"Play" の 3 つのボタンを作成し、@IBOutlet と @IBAction を接続します。オーディオを録音するにはマイクが必要です.xCode 7 と iOS 9 とその動作に対してテストしました.