Swift AVAudioPlayer不会播放用AVAudioRecorder录制的音频

时间:2014-12-11 12:45:04

标签: ios swift avaudioplayer avaudiorecorder

我已经构建了一个记录音频剪辑的应用程序,并将其保存到名为xxx.m4a的文件中。

录制完成后,我可以在我的系统上找到这个xxx.m4a文件并播放它 - 然后播放回来。问题是没有录制这个音轨。

我的问题是在应用内播放此音轨。

// to demonstrate how I am building the recordedFileURL
let currentFileName = "xxx.m4a"
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let docsDir: AnyObject = dirPaths[0]
let recordedFilePath = docsDir.stringByAppendingPathComponent(currentFileName)
var recordedFileURL = NSURL(fileURLWithPath: recordedFilePath)

// quick check for my own sanity
var checkIfExists = NSFileManager.defaultManager()
if checkIfExists.fileExistsAtPath(recordedFilePath){
    println("audio file exists!")
}else{
    println("audio file does not exist")
}

// play the recorded audio
var error: NSError?
let player = AVAudioPlayer(contentOfURL: recordedFileURL!, error: &error)
if player == nil {
    println("error creating avaudioplayer")
    if let e = error {
        println(e.localizedDescription)
    }
}
println("about to play")
player.delegate = self
player.prepareToPlay()
player.volume = 1.0
player.play()
println("told to play")

// -------

// further on in this class I have the following delegate methods:
func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool){
    println("finished playing (successfully? \(flag))")
}
func audioPlayerDecodeErrorDidOccur(player: AVAudioPlayer!, error: NSError!){
    println("audioPlayerDecodeErrorDidOccur: \(error.localizedDescription)")
}

运行此代码时我的控制台输出如下:

audio file exists!
about to play
told to play

我无法从audioPlayerDidFinishPlayingaudioPlayerDecodeErrorDidOccur登录到控制台。

有人可以向我解释为什么我的音频片段没有播放?

非常感谢。

2 个答案:

答案 0 :(得分:5)

你玩代码很好;您唯一的问题是AVAudioPlayer对象的范围。基本上,你需要在玩家一直玩的时候强烈引用玩家,否则它会被ARC摧毁,因为它认为你不需要它更多。

通常,您可以使AVAudioPlayer对象成为您的代码所在类的属性,而不是使其成为方法中的局部变量。

答案 1 :(得分:1)

在初始化AVAudioPlayer之前,您想要使用扬声器播放的位置,请添加以下代码:

import numpy as np
data = {}
testdata = np.array([1,2,3,4,5])

data['set1'] = {'a': testdata, 'b': testdata, 'c': testdata}
data['set2'] = {'a2': testdata, 'b2': testdata, 'c2': testdata}
data['set3'] = {'a3': testdata, 'b3': testdata, 'c3': testdata}

当你刚刚使用AVAudioRecorder进行录制时,请在初始化之前使用它:

let recordingSession = AVAudioSession.sharedInstance()
        do{
            try recordingSession.setCategory(AVAudioSessionCategoryPlayback)
        }catch{

        }