快速自动播放声音

Posted

技术标签:

【中文标题】快速自动播放声音【英文标题】:Playing sound automatically in swift 【发布时间】:2016-03-02 15:13:29 【问题描述】:

大家好,我正在尝试在我的 xcode 游戏中自动启动时快速播放声音,并且我尝试了很多不同的代码。我能够在 Objective-C 中编写和运行它,就像下面在 viewdidload 方法中一样,我为声音本身创建了一个方法并在 viewdidload 中调用它。

-(void)Loadingsound 

AudioservicesPlaySystemSound(Loadingsound);



-(void)viewDidLoad 

[super viewDidLoad];

NSURL *LoadingSound = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Tap Sound" ofType:@"wav"]];

AudioServicesCreateSystemSoundID((__bridge CFURLRef)LoadingSound, &Loadingsound);

[self Loadingsound];

但现在我试图快速复制相同的内容,但我无法这样做。我在另一个关于堆栈溢出的问题中看到了下面的这段代码,但由于现在这是在 Xcode 7.2.1 和 Swift 2.0 上,是否有可能有一种新的方法来编写它?这是我尝试过的代码,游戏开始时声音不加载。

override func viewDidLoad() 

    super.viewDidLoad()


if let soundURL = NSBundle.mainBundle().URLForResource("Tap Sound", withExtension: "wav") 
        var mySound: SystemSoundID = 0

        AudioServicesCreateSystemSoundID(soundURL, &mySound)

        // Play

        AudioServicesPlaySystemSound(mySound);

我尝试运行代码的另一种方法是......

覆盖 func viewDidLoad()

    super.viewDidLoad()

var loadingsound = NSURL(fileURLWithPath: 

NSBundle.mainBundle().pathForResource("Tap Sound", ofType: "wav"))

    var audioPlayer = AVAudioPlayer()

        audioPlayer = AVAudioPlayer(contentsOfURL: loadingsound, error: nil)
        audioPlayer.prepareToPlay()

        audioPlayer.play()

在这个方法中,当我尝试运行它时,编译失败并显示一个错误,告诉我输入一个“!”在输入“wav”并在其后放置支架后签名。在我输入感叹号后,它告诉我替换下面的“错误”一词并输入“filetypeHint”。有人请帮我解决这个问题。原件在objective-c中运行良好,有人可以帮我将确切的代码翻译成swift。我看到的其他示例显示错误。

谢谢!

【问题讨论】:

【参考方案1】:

检查您的“Tap Sound”声音文件是否在您的项目目标中。您需要通过URLForResource 加载,就像我的情况一样,不要设置扩展类型。您只需要文件名。你可以把它放在这样的方法中。

func playMusic(_ filename: String) 
    var audioPlayer: AVAudioPlayer?
    let url = Bundle.main.url(forResource: filename, withExtension: nil)
    if (url == nil) 
       print("Could not find file: \(filename)")
       return
    

    do 
        try audioPlayer =  AVAudioPlayer(contentsOf: url!)
        let player = audioPlayer

        // From Documentation: Negative integer value to loop the sound indefinitely until you call the stop method.
        player!.numberOfLoops = -1
        player!.prepareToPlay()
        player!.play()
     catch _ 
        audioPlayer = nil;
     


// call the function with your soundfile
playMusic("Tap Sound")

【讨论】:

非常感谢!我尝试了您的代码,并像您所说的那样使用 playMusic("Tap Sound") 在 vi​​ewdidload 中运行了该方法,并且在应用程序启动时它起作用了!在它无法在目标中找到文件之前,现在它是。非常感谢你的帮助兄弟! 是的,很高兴它有效并且我可以帮助你。 @GianmarcoBelmonte 从非常旧的 Swift 升级时,请不要忘记方法签名中的 _

以上是关于快速自动播放声音的主要内容,如果未能解决你的问题,请参考以下文章

按下一个按钮它会发出声音。快速点击按钮和声音播放弹出和点击

AVFoundation 快速播放声音 2

video实现有声音自动播放

快速连续播放剪辑时的点击声音

快速播放声音似乎不适用于我的应用程序

iphone快速加载声音文件