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

我没有从audioPlayerDidFinishPlayingaudioPlayerDecodeErrorDidOccur 登录控制台。

谁能解释一下为什么我的音频片段没有播放?

非常感谢。

【问题讨论】:

您的播放器代码在什么范围内?请记住,如果您的播放器实例是函数中的一个变量,例如,一旦函数退出,它将超出范围,因此 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 录制的音频的主要内容,如果未能解决你的问题,请参考以下文章

Swift AVAudioPlayer 不播放声音

AVAudioPlayer 不播放音频文件 - swift

Swift - AVAudioPlayer,声音播放不正确

Swift - AVAudioPlayer 不播放声音

如何持续检查 AVAudioplayer 是不是已在 Swift 中播放完毕?

Swift5 播放 aac 文件 AvAudioPlayer