【问题标题】:my iOS SwiftUI project doesn't play sounds with AVAudioPlayer我的 iOS SwiftUI 项目不使用 AVAudioPlayer 播放声音
【发布时间】:2021-01-02 19:26:28
【问题描述】:

我有一个愚蠢的问题,但由于某种原因我无法解决它。我尝试使用 AVAudioPlayer 播放声音,但听不到任何声音。没有错误,但我的应用程序仍然是静默的。它使用 SwiftUI 构建。这是一段代码:

struct SoundsListView: View {
    
   var body: some View {
        List(Helpers.shared.sounds, id:\.self) { item in
            Text(item)
            Spacer()
            Button(action: {
                var soundPlayer: AVAudioPlayer?
                guard let audioFile: URL = Bundle.main.url(forResource: "Analog watch", withExtension: "mp3") else { return }
                do {
                    soundPlayer = try AVAudioPlayer(contentsOf: audioFile)
                    print(soundPlayer)
                    guard let player = soundPlayer else { return }
                   player.play()
                } catch let error {
                    print("Cannot play sound")
                }
            }) {
                Image(systemName: "play")
            } //: BUTTON
        }
    }
} 

没有错误,声音文件也设置了目标成员资格。 (奇怪的是,同一段代码也适用于我的旧项目,但用 Swift + Storyboards 编写)

模拟器和硬件设备都没有声音。静音模式关闭,音量设置为最大。 我不知道这里出了什么问题。

顺便说一句:这个应用程序向用户发送通知并且声音正常。但不是在这段代码中

【问题讨论】:

  • 嗨,是否调用了任何打印命令?另外,当您按下按钮时,您能否看到您的视图是否正在重新渲染?

标签: ios xcode swiftui avaudioplayer


【解决方案1】:

您的AVAudioPlayer 仅存在于您的按钮操作范围内,因此在播放声音之前它已被释放。您需要将它保存在某个地方……我认为您可以在 SoundsListView 中将其声明为 @State var,但最好将其完全从 SwiftUI 视图中重构出来。

编辑:您可能还需要设置 AVAudioSession,它可以让您更改播放类别并控制音频与其他音频的交互方式,例如音乐播放。

例子:

do {
    try AVAudioSession.sharedInstance().setCategory(.playback)
    try AVAudioSession.sharedInstance().setCategory(.playback, options: [.mixWithOthers])
    try AVAudioSession.sharedInstance().setActive(true)
} catch {
    print(error)
}

【讨论】:

  • 我只是将它移动到单独的文件中,但它根本没有帮助。再次没有错误。我还尝试在 player.play() 之后打印“播放器”变量,然后进入控制台:Optional()。还是不知道怎么办
  • 更新:声音适用于连接到 iphone 的耳机。这是为什么?我把整个播放器搬到了单独的班级。但是如何切换到扬声器?
  • 您可能打开了响铃/静音开关,默认情况下会静音扬声器音频。查看 AVAudioSession,它可以让您更改播放类别并控制音频与其他音频的交互方式,例如音乐播放。
  • 谢谢,我会试试的。设备已静音(我试过模拟器、iPhone、iPad)。同样正如我所说,同时我运行用故事板编写的旧应用程序,它工作正常。再次感谢您的提示
【解决方案2】:

对我来说,音频有时会起作用。我必须确保当我在 SwiftUI 视图中声明我的音频播放器时,它是一个 @State 对象。在我的财产之前添加@State 之后,它每次都播放!我在一个单独的文件中导入 AVKit,我有我的音频播放功能......就像我在下面粘贴的一样。如果您需要更多说明,请 Lmk。

//In my View I have something like this at the top 

struct ContentView: View {
    
    @State var vm = PlayViewModel()   

//When I want some audio to play I call it like this...                      vm.play(fileNamed: "blip")
//And the rest of my SwiftUI code below

}

//然后这是我在单独的 Swift 文件中设置的内容。

导入 AVKit

class PlayViewModel {
    
    private var audioPlayer: AVAudioPlayer!
    
    
    func play(fileNamed:String) {
        let sound = Bundle.main.path(forResource: fileNamed, ofType: "wav")
        
        audioPlayer?.prepareToPlay() //maybe not needed?  idk

        do {
            audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: sound!))
            audioPlayer?.play()
        } catch {
            print(error)
        }
    }
}

【讨论】:

    猜你喜欢
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多