Swift AVAudioPlayer 不会播放用 AVAudioRecorder 录制的音频
Posted
技术标签:
【中文标题】Swift AVAudioPlayer 不会播放用 AVAudioRecorder 录制的音频【英文标题】:Swift AVAudioPlayer wont play audio recorded with AVAudioRecorder 【发布时间】:2014-12-11 12:45:03 【问题描述】:我已经构建了一个应用程序,它可以录制音频剪辑,并将其保存到一个名为 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
登录控制台。
谁能解释一下为什么我的音频片段没有播放?
非常感谢。
【问题讨论】:
您的播放器代码在什么范围内?请记住,如果您的播放器实例是函数中的一个变量,例如,一旦函数退出,它将超出范围,因此 ARC 可以收集其内存,这可能会在它之前销毁它开始播放...(尝试使您的player
对象成为该类的属性,这就是我的意思,所以它会在一段时间内徘徊...)
@MattGibson 这就像一个魅力 - 非常感谢!将此作为正确答案发布,我会让您正确。
【参考方案1】:
你玩代码没问题;您唯一的问题是您的 AVAudioPlayer
对象的范围。基本上,你需要在播放器播放的所有时间保持对播放器的强引用,否则它会被 ARC 销毁,因为它会认为你不再需要它。
通常您会将 AVAudioPlayer 对象设为您的代码所在的任何类的属性,而不是将其设为方法中的局部变量。
【讨论】:
【参考方案2】:在初始化 AVAudioPlayer 之前,在你想使用扬声器播放的地方,添加以下代码:
let recordingSession = AVAudiosession.sharedInstance()
do
try recordingSession.setCategory(AVAudioSessionCategoryPlayback)
catch
当您只是使用 AVAudioRecorder 录制时,请在初始化之前使用它:
do
recordingSession = AVAudioSession.sharedInstance()
try recordingSession.setCategory(AVAudioSessionCategoryRecord)
catch
【讨论】:
以上是关于Swift AVAudioPlayer 不会播放用 AVAudioRecorder 录制的音频的主要内容,如果未能解决你的问题,请参考以下文章