音频未播放 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的主要内容,如果未能解决你的问题,请参考以下文章
Swift AVAudioPlayer (Xcode) - 在应用程序包外播放音频文件
如何在 Xcode11 中的 Swift 中随机播放数组中的音频文件?
Clang:错误:链接器命令失败,退出代码 1(使用 -v 查看调用)Xcode 10、Xcode 10.1 Beta、Swift 4.2