音频未在 SwiftUI 中播放

Posted

技术标签:

【中文标题】音频未在 SwiftUI 中播放【英文标题】:Audio not playing in SwiftUI 【发布时间】:2019-07-22 21:07:13 【问题描述】:

我在调用该函数时无法播放音频文件。

我正在使用 AVAudioPlayer 尝试按照此处的说明播放文件: https://www.hackingwithswift.com/example-code/media/how-to-play-sounds-using-avaudioplayer 在视图中按下按钮后,它会调用一个函数来播放声音,但据我所知,什么都没有播放。没有抛出任何错误,并且找到了文件。当按下按钮时,该应用程序还使用语音合成器,并且可以正常播放。

我查看了堆栈溢出并按照此处的说明进行操作: Where to place code for audio playback in a SwiftUI app

但按下按钮时仍然没有播放音频。

这里是函数:

    func playSound() 
        var sound = AVAudioPlayer()

        if let path = Bundle.main.path(forResource: "TryAgain", ofType: "wav") 
            do 
                sound = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
                print("Playing sound")
                sound.play()
             catch 
                print( "Could not find file")
            
        

这是课程:

class Player: BindableObject 

    let willChange = PassthroughSubject<Player, Never>()

    var isPlaying: Bool = false 
        willSet 
            willChange.send(self)
        
    

    func playSound() 
        var sound = AVAudioPlayer()

        if let path = Bundle.main.path(forResource: "TryAgainWav", ofType: "wav") 
            do 
                sound = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
                print("Playing sound")
                sound.play()
             catch 
                print( "Could not find file")
            
        
    

更新:不确定这是否有帮助,但我使用 IB 而不是 SwiftUI 构建了它,并注意到当我单击按钮播放音频文件时,控制台中会打印相同的消息:

2019-07-22 11:29:41.075568-0700 PlaySoundPrac[13952:46549155] [插件] AddInstanceForFactory:没有为 id F8BB1C28-BAE8-11D6-9C31-00039315CD46 注册工厂

任何帮助将不胜感激

【问题讨论】:

你应该在try AVAudiosession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: AVAudioSession.Mode.default, options: AVAudioSession.CategoryOptions.defaultToSpeaker)try AVAudioSession.sharedInstance().setActive(true)之前配置音频会话 【参考方案1】:

我自己还是个新手,但我会尽力而为。如果将 AVAudioPlayer 的声明移到函数之外会发生什么?例如:

import Combine

class Player: ObservableObject 

    var sound: AVAudioPlayer! 

    let willChange = PassthroughSubject<Player, Never>()

    var isPlaying: Bool = false 
        willSet 
            willChange.send(self)
        
    

    func playSound() 

        if let path = Bundle.main.path(forResource: "TryAgainWav", ofType: "wav") 
            do 
                sound = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
                print("Playing sound")
                sound.play()
             catch 
                print( "Could not find file")
            
        
    

试试这个,让我知道它是否有效!谢谢。

【讨论】:

成功了!谢谢 没问题。乐于助人。 工作得很好!不知道为什么你的答案是-1。尝试添加+2 :),确保添加import CombineBindableObject is now ObservableObject【参考方案2】:

我遇到了一个问题,即在 Xcode 11.5 中的 iOS 13 模拟器上无法播放音频,而在 Xcode SwiftUI 预览和物理设备中正常。

【讨论】:

以上是关于音频未在 SwiftUI 中播放的主要内容,如果未能解决你的问题,请参考以下文章

在swiftui中按钮的触摸动作播放音频

在 SwiftUI 中播放音频时无法更新行颜色

在 SwiftUI 中使用滑块创建音频播放器单元格

SwiftUI 的播放/停止按钮

在 SwiftUI 应用程序中放置音频播放代码的位置[关闭]

如何在 SwiftUI 中等待音频完成?