我已经构建了一个记录音频剪辑的应用程序,并将其保存到名为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
我无法从audioPlayerDidFinishPlaying
或audioPlayerDecodeErrorDidOccur
登录到控制台。
有人可以向我解释为什么我的音频片段没有播放?
非常感谢。
答案 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{
}