使用不同的 swift 文件播放音频

Posted

技术标签:

【中文标题】使用不同的 swift 文件播放音频【英文标题】:play audio using different swift file 【发布时间】:2017-10-16 21:01:17 【问题描述】:

下面是代表音频播放器文件的代码。我正在尝试利用它在我的程序中播放声音。我不想在每个视图控制器中放置一个 AVPlayer 函数来播放可重复的声音,所以我正在寻找一种将所有内容放在一个地方并在需要时调用特定函数(音乐、点击、介绍)的方法

import UIKit
import AVFoundation

class player: UIViewController

var music:Bool = true
var sound:Bool = true
var intro:Bool = true

var soundPlayer: AVAudioPlayer?
var clickPlayer: AVAudioPlayer?
var musicPlayer : AVAudioPlayer?

    get
    
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        return appDelegate.musicPlayer
    
    set
    
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.musicPlayer = newValue
    


func playSound(title: String, format: String)

    if sound == true
    
        guard let url = Bundle.main.url(forResource: title, withExtension: format)

            else  return 

        do
        
            try AVAudiosession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

            soundPlayer = try AVAudioPlayer(contentsOf: url)

            soundPlayer?.play()
        
        catch let error
        
            print(error.localizedDescription)
        
    


func playClick()

    if sound == true
    
        guard let url = Bundle.main.url(forResource: "click", withExtension: "mp3")

            else  return 

        do
        
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

            let clickPlayer = try AVAudioPlayer(contentsOf: url)

            clickPlayer.play()
        
        catch let error
        
            print(error.localizedDescription)
        
    


func playMusic()

    if music == true
    
        guard let url = Bundle.main.url(forResource: "ambientMusic", withExtension: "mp3")

            else  return 

        do
        
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

            musicPlayer = try AVAudioPlayer(contentsOf: url)

            musicPlayer?.play()
            musicPlayer?.numberOfLoops = -1
        
        catch let error
        
            print(error.localizedDescription)
        
    


不同的文件:

@IBAction func play(_ sender: Any)

    player().playClick()
    performSegue(withIdentifier: "menuToIntro", sender: self)

但它不播放任何东西。只打印日志 AQDefaultDevice (173): skipping input stream 0 0 0x0

【问题讨论】:

【参考方案1】:

从讨论 here 这是 Xcode 模拟器的一个错误,你应该尝试去 Edit Scheme > Run > Arguments 和 添加环境变量 OS_ACTIVITY_MODE,值 disable。

【讨论】:

好吧,我清除了控制台内的日志,是的,但这并没有解决问题【参考方案2】:

好的,发现一个问题。在我的情况下,有必要将播放器存储为不会被破坏的属性或其他变量。这就是为什么播放日志 - 声音但立即终止的原因。我通过在 AppDelegate 中声明 AVAudioPlayers 来修复它

【讨论】:

以上是关于使用不同的 swift 文件播放音频的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 播放随机音频文件

使用 Swift for MacOS 播放音频文件

Mac - Swift 3 - 排队音频文件和播放

在 Swift 中使用 EZAudio 框架播放音频文件

如何在 Swift 3 中使用 AVAudioPlayer 播放 .ogg 音频文件?

如何在 Swift 中连续录制音频并播放同一文件中的音频?