为啥我无法播放 AVAudioRecorder 录制的声音文件?

Posted

技术标签:

【中文标题】为啥我无法播放 AVAudioRecorder 录制的声音文件?【英文标题】:Why can't I playback sound files recorded by AVAudioRecorder?为什么我无法播放 AVAudioRecorder 录制的声音文件? 【发布时间】:2015-11-27 12:53:14 【问题描述】:

这就是我定义 myrecorder 和 myplayer 的方式

var myrecorder:AVAudioRecorder!
var myplayer : AVAudioPlayer!

这是在 viewDidLoad() 中设置 myrecorder 的代码

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    filepath = "\(getDocumentsDirectory())/001.caf"
    print(filepath)

    try! session.setCategory(AVAudiosessionCategoryPlayAndRecord)
    //define settings
    let recordSettings: [String: AnyObject] = [
        AVFormatIDKey: NSNumber(unsignedInt: kAudioFormatMPEG4AAC),
        AVEncoderAudioQualityKey : AVAudioQuality.Medium.rawValue,
        AVSampleRateKey: 44100.0,
        AVNumberOfChannelsKey: 2,
    ]
    myrecorder = try! AVAudioRecorder(URL: NSURL(fileURLWithPath: filepath), settings: recordSettings)
    myrecorder.delegate = self
    myrecorder.prepareToRecord()

我有控制记录和停止的按钮,我得到了文件 001.caf。我可以播放声音文件,但我认为文件不够好。

@IBAction func Play() 
    try! myplayer = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: filepath))
    myplayer.volume = 0.5
    myplayer.play()
    print("Playing...")

播放成功,没有任何错误或崩溃。只有一个问题,播放时没有声音。

我认为我在录制阶段遗漏了一些东西,但我找不到它。请帮忙。

【问题讨论】:

【参考方案1】:

问题在于在这一行中实例化的 AVAudioPlayer。

try! myplayer = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: filepath))

这个实例 myplayer 将在播放功能完成后立即被释放。

在另一个函数中实例化 AVAudio 播放器,例如 Viewdidload,这样它即使在控件离开播放函数后仍然存在。

【讨论】:

不,它不起作用。我在外面有 myplayer 定义。让我正确解决问题 而且,顺便说一句,如果您在 Viewdidload 中启动它,它不会使实例永久化。要使实例坚持,您必须在任何特定方法之外定义它,这有效地使其坚持自我。当自我在那里时,对象就在那里。而且你在定义它时也不能放弱。何时何地初始化实例并不重要。我以为我不必显示定义代码,因为我的实例名称之前没有 LET,这意味着我已经在外面定义了它。这都是关于变量的范围。【参考方案2】:

好的,终于找到问题了。

您不能使用 AVAudioSessionCategoryPlayAndRecord。

录制时必须使用 AVAudioSessionCategoryRecord,播放时必须使用 AVAudioSessionCategoryPlayback。并且您在播放和录制时来回设置会话。

AVAudioSessionCategoryPlayAndRecord 用于需要同时播放和录音的情况,比如语音聊天时...

【讨论】:

不是这样。 AVAudioSessionCategoryPlayAndRecord 上的文档说:“此类别适用于同时录制和播放,也适用于录制和播放但不是同时进行的应用程序 [我的斜体]。” 自己试试吧。我想我们不能真正遵循文件所说的 100%。就我而言,如果我使用的是 AVAudioSessionCategoryPlayAndRecord,那么我无法播放我录制的 CAF 文件。当我将类型切换为播放时播放和录制时录制时,一切正常。 我注意到您在代码中设置了会话类别,但您从未激活会话。这更有可能是问题所在。

以上是关于为啥我无法播放 AVAudioRecorder 录制的声音文件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥录屏没声音

AVAudioRecorder 和 AVAudioPlayer

播放暂停的 AVAudioRecorder 文件

CocosDenshion 无法播放录制的声音

AVAudioRecorder 不保存文件

AVAudiorecorder 和 AVAudioPlayer 并不总是播放声音