如何从 Swift 文件管理器播放音频文件?

Posted

技术标签:

【中文标题】如何从 Swift 文件管理器播放音频文件?【英文标题】:How do I play an audio file from Swift File Manager? 【发布时间】:2021-05-05 03:51:41 【问题描述】:

我正在尝试播放从 S3 下载的文件,在找到该文件并将 URL 传递给音频播放器后,音频文件将无法播放/丢失。

这是完整的fileURLfile:///var/mobile/Containers/Data/Application/61F2FC20-4C62-4263-B147-0010805BC0FA/Documents/Dump%20Trucks.mp3

这是我的代码:

    func playAudio()
    
    var soundClip: AVAudioPlayer?
    
    if let directory = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.allDomainsMask, true).first

        let path = NSURL(fileURLWithPath: directory).appendingPathComponent("Dump Trucks.mp3")

        print("The path is \(String(describing: path))")
        
        do 
            soundClip = try AVAudioPlayer(contentsOf: path!)
            soundClip?.play()
         catch 
            print("Error: Audio File missing.")
        
    

【问题讨论】:

如果您想从设备播放音频,请使用MPMediaItem。它将从设备中检索所有音频。 还有一件事我想知道你会在这条线上找到正确的道路吗? //print("路径是 (String(describing: path))") @RB's - 是的,它打印/返回上面指出的完整文件 URL。 var soundClip: AVAudioPlayer? 将其更改为 var soundClip = AVAudioPlayer() 您可以查看此解决方案是否适用于 Swift 4+ ***.com/a/55149648/2125010 【参考方案1】:
import Foundation
import AVFoundation

final class MediaPlayer 
    static var player = AVAudioPlayer()

    class func play() 
        do 
            let file = Bundle.main.url(forResource: "file_name", withExtension: "mp3")!
            player = try AVAudioPlayer(contentsOf: file)
            player.numberOfLoops = 0 // loop count, set -1 for infinite
            player.volume = 1
            player.prepareToPlay()

            try AVAudiosession.sharedInstance().setCategory(.playback, mode: .default, options: [])
            try AVAudioSession.sharedInstance().setActive(true)

            player.play()
         catch _ 
            print("catch")
        
    

【讨论】:

【参考方案2】:

问题是你的播放器是一个局部变量。这样你的方法就结束了,播放器在它有机会开始播放之前就被摧毁了!改为将其声明为实例属性。

所以

func playAudio()
    var soundClip: AVAudioPlayer?

变成

var soundClip: AVAudioPlayer?
func playAudio()

这可能无法解决您的所有问题,但如果您不这样做,您肯定永远听不到声音。

【讨论】:

以上是关于如何从 Swift 文件管理器播放音频文件?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

swift Swift Playground展示了如何使用AVAudioPlayerNode,AVAudioMixerNode,AVAudioEng在背景音频文件上播放多个wav文件

如何在启动屏幕中快速播放音频文件