macOS 上的 swift: AVAudioPlayer 立即停止

Posted

技术标签:

【中文标题】macOS 上的 swift: AVAudioPlayer 立即停止【英文标题】:swift on macOS: AVAudioPlayer stops immediately 【发布时间】:2017-11-22 04:49:38 【问题描述】:

我在 Swift 中有一个 macOS(不是 ios)项目。

在我的主 AppDelegate.swift 中,我实例化了一个名为 PlaySound 的类,然后调用 startSound()

名为 PlaySound.swift 的类播放 mp3。但是,除非我在任一类文件中调用 play 后不久放置 sleep() ,否则我听不到任何声音。我以为我失去了对类实例化​​的引用,但我可以调用一个测试打印函数,如您所见,并且有效。

有人知道为什么音频停止了吗?

感谢您的帮助 -比尔

import Cocoa 

@NSApplicationMain

class AppDelegate: NSObject, NSApplicationDelegate 

    func applicationDidFinishLaunching(_ aNotification: Notification) 
    // Insert code here to initialize your application
        let myCheck = PlaySound()
        myCheck.startSound()
        sleep(7)
        myCheck.testPrint()
    

    func applicationWillTerminate(_ aNotification: Notification) 
    // Insert code here to tear down your application
    

下面的 PlaySound 类...

import Foundation
import AVKit

class PlaySound 

    var soundFile = "crickets"
    var myPlayer = AVAudioPlayer()

    func startSound() 
        do 
            self.myPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: soundFile, ofType: "mp3")!))
            //set the number of loops to "infinite"
            self.myPlayer.numberOfLoops = -1
            self.myPlayer.prepareToPlay()
            //set the volume to muted
            self.myPlayer.volume = 0
            //play the sound
            self.myPlayer.play()
            //fade in the sound
            self.myPlayer.setVolume(1, fadeDuration: 2)
        
        catch 
            print(error)
        
     // end of startSound

    func fadeOutSound() 
        myPlayer.setVolume(0, fadeDuration: 10)
        myPlayer.stop()
    

    func testPrint() 
        print("yes this works")
    
 // end of aclass

【问题讨论】:

在使用 sleep() 之前,了解它的作用。 @ElTomato 感谢您的回信。你的意思是我应该研究一下 sleep() 的作用吗?或者,我应该在调用 sleep() 之前立即找出代码在做什么? 你解决了吗?我有这个问题。 【参考方案1】:

一旦 applicationDidFinishLaunching 完成,myCheck 就会超出范围并被取消初始化,因此没有任何东西可以播放声音。您可以像这样将其保存在内存中:

class AppDelegate: NSObject, NSApplicationDelegate 

    let myCheck = PlaySound()

    func applicationDidFinishLaunching(_ aNotification: Notification) 
        myCheck.startSound()
    

【讨论】:

以上是关于macOS 上的 swift: AVAudioPlayer 立即停止的主要内容,如果未能解决你的问题,请参考以下文章

iPad 上的 Swift Playgrounds,NSLog 在 macOS 上的“Console.app”上不显示任何消息

有没有办法在 MacOS 上的 Swift 桌面应用程序中构建一个简单的 HTTP/JSON 服务器 API? [关闭]

使用 Swift 在 macOS 上显示 Unobtrusive 消息

macOS 上的 AVAudioInputNode 仅输出静音

NSURLSession 后台配置在 macOS 上的好处

远程通知中的自定义声音 iOS 10,swift 3