【问题标题】:Why doesn't ios system sound play in simulator?为什么ios系统声音不能在模拟器中播放?
【发布时间】:2014-09-17 17:26:40
【问题描述】:

我正在尝试播放系统声音。使用 Xcode 6 Beta 4。代码如下:

func playKeyClick()
{
    let filePath = NSBundle.mainBundle().pathForResource("Tock", ofType: "aiff")
    if NSFileManager.defaultManager().fileExistsAtPath(filePath) {
        println("file exists")
    }
    let fileURL = NSURL(fileURLWithPath: filePath)
    var soundID:SystemSoundID = 0
    AudioServicesCreateSystemSoundID(fileURL, &soundID)
    AudioServicesPlaySystemSound(soundID)
}

它在设备上运行良好,但在模拟器中无法播放。我创建了一个测试应用程序,它只会播放这个声音,所以我认为我没有做任何事情来阻止它。

模拟器可以播放来自 Safari 应用程序的声音,所以我认为这表明它能够播放来自我的应用程序的声音。

请注意,我还有其他代码用于以其他两种方式播放声音,这些方式也适用于设备,但不适用于模拟器。为了简单起见,我选择了这个例子。

编辑 - 将文件更改为资源包以避免混淆

【问题讨论】:

  • 您应该在设置该声音后断言(即 assert(soundID != 0) ),以确保其已设置。 AudioServicesCreateSystemSoundID 也返回一个 OSStatus,println 它。
  • 我已经根据 sound-not-working-in-iphone-simulator answer 的建议调整了我的系统声音设置和 midi 设置。我唯一不能尝试的是为输入设置线路输入,选项不存在(改为使用麦克风)。
  • 已检查 soundID,得到一个非 0 值 (4097)
  • 进度 - 在尝试更改声音设置(并重新启动)后,我正在使用我的主应用程序进行测试。刚刚检查了我的测试应用程序(只做声音检查),它现在可以工作了。但是在我的主应用程序中没有相同的调用。

标签: ios swift ios-simulator


【解决方案1】:

我正在回答我自己的问题以澄清我所学到的东西。有三个问题阻止了我的原始代码工作。注意我在模拟器上使用的是 Xcode6 Beta4 和 iphone 5s。

1- 我使用的“/System/Library/Audio/UISounds/Tone.caf”的原始文件路径在模拟器中不起作用,它仅在设备上有效。通过将音频文件添加到应用程序来更正该问题。

2- Sound not working in iPhone Simulator? 提供的信息在 ios 7.1 及更早版本上运行良好。不知道这几个建议中的哪一个有效,因为我在运行它们时正在使用 ios8 进行测试。

3- 因为在 ios7 上工作的相同代码在 ios8 上不起作用,我假设 io8 模拟器代码中存在错误(ios8 设备工作正常)。在我尝试发出声音的三种方法中,只有一种不起作用:

AudioServicesPlaySystemSound() - 不起作用

AudioUnit 输出 - 有效

AVAudioPlayer - 工作

【讨论】:

  • 我确认 AudioServicesPlaySystemSound() 不能像在 iOS 7.1 中那样工作。模拟器中不播放声音,但在实际设备中可以正常工作。 (在 Xcode 6 GM 上测试)
  • AudioServicesPlaySystemSound() 在模拟器中对我不起作用。它确实在设备上工作。使用 Xcode 6.0.1 和 iOS 8.0 测试。
  • 嗨,JimT,你能用“AudioUnit 输出 - 工作”和“AVAudioPlayer - 工作”澄清你的意思吗?谢谢
  • Brabbeldas,使用这些 API,我能够从模拟器中获得声音。
  • 哇。如果我能把我浪费在 Apple 废弃的 API 上的每一个小时都找回来就好了。我不敢相信他们实际上让我更喜欢 Java 库而不是他们几乎没有维护的垃圾。 AudioServicesPlaySystemSound 仍然无法在 iOS 9 的模拟器中运行。
【解决方案2】:

因为您指定的路径中不存在文件。要对此进行测试,请在本地保存一个声音文件并在您的代码中指定其路径(参见下面的示例) -

    let fileURL = NSURL(fileURLWithPath: "/Users/<Home dir>/Desktop/yoursund.mp3")

【讨论】:

  • 我编辑了我的问题以使文件成为应用程序的本地文件并打印验证它是否找到了该文件。问题依旧
猜你喜欢
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多