音频未播放 Xcode 10.1 Swift 4

Posted

技术标签:

【中文标题】音频未播放 Xcode 10.1 Swift 4【英文标题】:Audio is not playing Xcode 10.1 Swift 4 【发布时间】:2019-11-24 10:38:47 【问题描述】:

我终于开始学习播放声音,但我没有成功在我的应用中播放声音。我仍在使用 Xcode 10.1/Swift4(不是 4.2),因为我还不能升级到 Mojave/Catalina。 我阅读了很多关于 .setCategory(.playback, mode: .default) 在 Xcode 10.1 中携带错误的帖子,但找到的解决方案适用于 Swift 4.2。 category:mode: 也应该是 String 类型,但在文档中,函数解释为:

func setCategory(_ category: AVAudiosession.Category, mode: AVAudioSession.Mode,选项:AVAudioSession.CategoryOptions = []) 抛出

它们不是String 类型。我有点迷路了。

我的代码没有抛出任何编译错误,但在控制台运行时我得到:

AVAudioSessionUtilities.mm:106:getUInt32: -- 类别值转换器 找不到字符串“环境”的匹配项

我在这里缺少什么?你能指出我理解这个类别问题的正确方向吗? 一如既往,非常感谢您的时间和帮助。

这是应该播放声音的函数:

static func playOnceSound(soundToPlay: String) 
       var player: AVAudioPlayer?
        guard let url = Bundle.main.url(forResource: soundToPlay, withExtension: "mp3") else  return 



        do 
//            try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default) // Error: Type 'String' has no member 'playback'

            try AVAudioSession.sharedInstance().setCategory("ambient", mode: "default", options: .defaultToSpeaker)
            try AVAudioSession.sharedInstance().setActive(true)

            /* The following line is required for the player to work on iOS 11. Change the file type accordingly*/
            player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)

            /* iOS 10 and earlier require the following line:
             player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileTypeMPEGLayer3) */

            guard let player = player else  return 
            player.numberOfLoops = 1
            player.volume = 1.0
            player.play()

         catch let error 
            print(error.localizedDescription)
        
    

【问题讨论】:

【参考方案1】:

您是否尝试过以这种方式输入环境和默认值,而不是使用字符串?另外,在 setCategory 之前实例化音频会话对象:

var audioSession: AVAudioSession?

func setup() 
    audioSession = AVAudioSession.sharedInstance()

    do 
        try audioSession.setCategory(AVAudioSession.Category.ambient, mode: .default, options: .defaultToSpeaker)
        try audioSession.setActive(true)
    
    catch 
        print("Failed to set category", error.localizedDescription)
    

【讨论】:

嗨,它与代码中注释掉的尝试相同。抛出错误// Error: Type 'String' has no member 'playback'.. 你看到它期待String.ambient 因为.default.playback 模式不是.. @Vincenzo - 我已经编辑了我的答案,希望就是这样。 我发现这是我系统中的正确方法。 try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, mode: AVAudioSessionModeDefault, options: AVAudioSessionCategoryOptions.defaultToSpeaker)。我想是时候更新到更现代的 Swift 版本了。谢谢你的帮助。哈斯塔 luego。【参考方案2】:
@IBAction func doPlay1(_ sender: AnyObject) 
    do
        self.audioPlayer = try AVAudioPlayer(contentsOf: URL.init(string: url)!)
        self.audioPlayer.prepareToPlay()
        self.audioPlayer.delegate = self
        self.audioPlayer.play()
    catch
        print(error.localizedDescription)
    

【讨论】:

【参考方案3】:

所以我只是将它设置为AppDelegate didFinishLaunchingWithOptions 为:

 do 
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
         catch let error1 as NSError
            error = error1
            print("could not set session. err:\(error!.localizedDescription)")
        
        do 
            try AVAudioSession.sharedInstance().setActive(true)
         catch let error1 as NSError
            error = error1
            print("could not active session. err:\(error!.localizedDescription)")
         

并将函数重写为:

static func playOnceSound(soundToPlay: String) 
        if Sounds.player!.isPlaying == true 
            Sounds.player!.stop()
        

        let url = URL(fileURLWithPath: Bundle.main.path(forResource: soundToPlay, ofType: "mp3")!)

        var error: NSError?

        do 
            Sounds.player = try AVAudioPlayer(contentsOf: url)
         catch let error1 as NSError 
            error = error1
            Sounds.player = nil
        

        if let err = error 
            print("audioPlayer error \(err.localizedDescription)")
            return
         else 
            Sounds.player!.prepareToPlay()
        
        //negative number means loop infinity
        Sounds.player!.numberOfLoops = 0
        Sounds.player!.volume = Sounds.volume
        Sounds.player!.play()

    

感谢您的帮助,我希望这对其他人有所帮助。 干杯。

【讨论】:

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

无法在 xcode 6 swift 中播放音频

Xcode Swift 7.3 播放音频文件

Swift AVAudioPlayer (Xcode) - 在应用程序包外播放音频文件

如何在 Xcode11 中的 Swift 中随机播放数组中的音频文件?

Clang:错误:链接器命令失败,退出代码 1(使用 -v 查看调用)Xcode 10、Xcode 10.1 Beta、Swift 4.2

音频完成后更改按钮 Xcode