【问题标题】:CFURLRef requires a bridged cast errorCFURLRef 需要桥接转换错误
【发布时间】:2012-07-28 19:17:47
【问题描述】:

我正在尝试播放声音,但是当我编码时:

AudioServicesCreateSystemSoundID ((CFURLRef) alertSound, &soundFileObject);

它会抛出以下错误:

将 Objective-C 指针类型“NSURL *”转换为 C 指针类型“CFURLRef”(又名“const struct __CFURL *”)需要桥接转换错误

我已经尝试了以下两种建议的解决方案:

AudioServicesCreateSystemSoundID ((__bridge CFURLRef) alertSound, &soundFileObject);

AudioServicesCreateSystemSoundID ((CFURLRef) CFBridgingRetain(alertSound), &soundFileObject);

但我仍然无法播放声音。

我想问题是:桥接错误是声音不播放的原因,还是我应该寻找其他地方?

我可以使用 SysSound 示例代码播放声音,我使用的是 iOS 6 和 Xcode 4.5。

感谢任何指点:)

【问题讨论】:

    标签: objective-c ios url audio


    【解决方案1】:

    演员可能不是没有播放声音的原因:

    AudioServicesCreateSystemSoundID ((__bridge CFURLRef) alertSound, &soundFileObject);
    

    没问题。

    您的错误很可能出在您没有向我们展示的代码中。常见问题是 URL 创建错误或文件格式无效。

    修改你的代码如下:

    OSStatus status = AudioServicesCreateSystemSoundID((__bridge CFURLRef)alertSound, &soundFileObject);
    NSLog(@"AudioServicesCreateSystemSoundID status = %ld", status);
    

    并检查你得到什么状态码; parmErr (-50) 比较常见,通常意味着您的 URL 为零。

    哦,还有一个想法,你没有显示你实际在哪里播放声音。你知道AudioServicesCreateSystemSoundID 实际上并没有播放声音。您需要致电:

    AudioServicesPlaySystemSound(soundFileObject);
    

    抱歉,如果您已经知道了!

    【讨论】:

    • 是的,-50。我的 NSURL 看起来像这样: NSURL *alertSound = [[NSBundle mainBundle] URLForResource: @"tap" withExtension: @"aif"];文件“tap.aif”位于我创建的名为 Sounds 的组中。是否有特定的地方需要放置它?非常感谢您的帮助!
    • 只是为了确保在调试器中检查或使用NSLog 确认 URL 确实为零。这意味着(正如我认为您开始怀疑的那样)Xcode 没有将您的声音复制到您的应用程序包中。您可以尝试从您的项目中删除它(仅供参考!!!!)并重新添加它,并仔细检查文件名的拼写是否正确(可能是 .aiff 吗?)。我不认为你需要把它放在任何特别的地方。我通常将这些东西放在 Xcode 创建的“支持文件”组中,但我认为这不是必需的。
    • 啊,明白了!谢谢! :) 不知道为什么一开始没有正确添加。干杯,idz!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多