【问题标题】:Can't hear System Sound in simulator or on device在模拟器或设备上听不到系统声音
【发布时间】:2010-08-12 16:33:36
【问题描述】:

我似乎无法在设备或模拟器中播放 AudioServices 声音。这是我的代码:

NSString *sndPath = [[NSBundle mainBundle] pathForResource:@"click" ofType:@"aiff"];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:sndPath], &soundID);
AudioServicesPlaySystemSound(soundID);
AudioServicesDisposeSystemSoundID(soundID);

我检查了我的系统偏好设置,是的,我确实勾选了“播放用户界面音效”...我可能做错了什么?

谢谢!

编辑:我正在尝试在用户在设备上移动触摸时创建音频点击,因此我需要它来快速播放相同的声音。我应该改用 AVAudioPlayer 吗?

【问题讨论】:

    标签: iphone ipad audio ios-simulator


    【解决方案1】:

    在完成播放之前不要释放声音。你可以这样做:

    AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, (AudioServicesSystemSoundCompletionProc)AudioServicesDisposeSystemSoundID, NULL);
    

    有点恶心,因为我们假设它不使用 Pascal 调用约定(即 AudioServicesDisposeSystemSoundID() 可以处理额外的 NULL 参数)。

    【讨论】:

    • 如果我快速调用声音并且有时我想在它完成前一个声音之前重新启动它会导致问题吗?
    • 我认为它们是作为独立对象创建的,因此它们最终会相互叠加。除此之外,它应该可以工作。试试看。
    • 嗯,它确实工作,谢谢!...但不幸的是,性能损失非常糟糕。我的帧速率从大约 25fps 下降到 16-17fps。我试图通过将实际的声音创建代码移动到 viewDidLoad 中来优化它,但现在点击只是间歇性地发生(并且性能影响仍然存在)。我应该改用 AVAudioPlayer 吗?
    • 如果声音创建在 viewDidLoad 中,我假设您已将声音处理移到 viewDidUnload 和 dealloc 中。另请注意,我不确定“空”系统声音 ID 是什么;大概是 0,但这没有记录。
    • 哦,是的,谢谢 - 以为我每次都必须调用 dispose,而不仅仅是在 viewDidUnload 上...这使它加载更快,谢谢!我需要把它放在 dealloc 和 viewDidUnload 中吗?
    猜你喜欢
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2015-01-27
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多