【问题标题】:Sound on simulator but not device模拟器上有声音,但设备上没有声音
【发布时间】:2010-01-06 16:49:51
【问题描述】:

我正在使用以下播放 m4a 文件:

NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: fileName];
SystemSoundID soundID;
NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];
AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);
AudioServicesPlaySystemSound(soundID);

它在模拟器上运行良好,但我在设备上没有听到任何声音。我正在使用的声音文件都保留在捆绑包中。以下是设备上的 filePath 的样子:

file://localhost/var/mobile/Applications/418945F3-3711-4B4D-BC65-0D78993C77FB/African%20Adventure.app/Switch%201.m4a

文件路径是否有问题,或者我需要为设备做些什么不同的事情?

【问题讨论】:

  • 确保您的手机没有处于静音模式!我花了 2 个小时才找到这个...

标签: iphone cocoa-touch core-audio


【解决方案1】:

就像旁注一样 - 我遇到了完全相同的问题,并且可能花了将近一个小时将文件转换为正确的格式等。但问题是 iPad 上的“静音”开关。所以即使音量调高了,我还能听到 iPad 上的其他声音,因为静音开关打开了,它并没有播放系统声音。

更令人困惑的是,这个应用程序使用文本转语音,听写的音量非常好,只有来自 AudioServicesPlaySystemSound() 的声音没有被播放。

【讨论】:

    【解决方案2】:

    我也遇到了麻烦。最后我意识到这是因为 AudioServices 只能播放具有以下约束的音频。

    您使用此播放的声音文件 函数必须是: - 持续时间不超过 30 秒 - 线性 PCM 或 IMA4 (IMA/ADPCM) 格式 - 打包在 .caf、.aif 或 .wav 文件中

    来自 Apple 文档:http://developer.apple.com/library/ios/#documentation/AudioToolbox/Reference/SystemSoundServicesReference/Reference/reference.html

    【讨论】:

      【解决方案3】:

      您可能希望使用 AVAudioPlayer 而不是 AudioServices。

      以下代码将获取一个音频文件 (.m4a) 并播放该音频文件 1 次。完成后不要忘记释放“audioPlayer”。

      NSString *urlAddress = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"m4a"];
      
      NSURL *url = [NSURL fileURLWithPath:urlAddress];
      NSError *error;
      
      AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
      audioPlayer.numberOfLoops = 0;
      
      if (audioPlayer == nil)
      {
        NSLog([error description]);
      }
      else
      {
        [audioPlayer play];
      }
      

      希望这个示例可以帮助您在实际设备上播放音频。在文件播放时增加设备音频也是一个好主意。

      注意:如果您尚未将 AVFoundation 框架添加到您的项目中,则需要这样做。以及导入头文件。

      #import <AVFoundation/AVFoundation.h>

      更新:

      来自 Apple 的 Core Audio Overview Document

      音频会话服务

      音频会话服务可让您管理应用程序中的音频会话 — 将应用程序中的音频行为与 iPhone 或 iPod touch 上的后台应用程序相协调。音频会话服务由 AudioToolbox.framework 的 AudioServices.h 头文件中声明的函数、数据类型和常量的子集组成。

      AVAudioPlayer 类

      AVAudioPlayer 类提供了一个简单的 Objective-C 接口来播放声音。如果您的应用程序不需要立体声定位或精确同步,并且您没有播放从网络流中捕获的音频,Apple 建议您使用此类进行播放。该类在 AVFoundation.framework 的 AVAudioPlayer.h 头文件中声明。

      【讨论】:

      • 谢谢。我会试试。为什么 AudioServices 无法播放声音?或者,为什么要使用一个而不是另一个?
      • 我现在基于用户事件(即按钮点击)使用 AVAudioPlayer。如果不是 nil,我会释放,创建实例并播放。因为我每次都创建一个实例,所以似乎有一个小的延迟。有没有更有效的方法?
      • @user230949:你可以制作一个声音对象,类似于this wrapper for SystemSoundID,只是你正在为AVAudioPlayer制作一个包装器。
      【解决方案4】:

      首先对您的退货进行错误检查。文件路径为零吗?是否有任何一个 AudioServices 函数返回错误?最可能的原因是区分大小写。 iPhone 文件系统区分大小写,而 Mac 不区分大小写。但调试的第一步是查看系统提供的错误。

      【讨论】:

      • filePath 不是零。它具有我在 OP 中发布的价值。我没有看到任何错误发生。
      • 你检查过OSStatus结果,都是noErr?
      • 如何查看 OSStatus 结果?
      • AudioServicesCreateSystemSoundID() 和 AudioServicesPlaySystemSound() 返回 OSStatus 类型的结果代码(所有音频函数都这样做)。如果它返回 0 (noErr),那么它是成功的。否则,它是一个负数,表示错误。它们记录在这里:developer.apple.com/iphone/library/documentation/AudioToolbox/…
      • 谢谢。 AudioServicesCreateSystemSoundID 确实返回 0,但 AudioServicesPlaySystemSound 为空。
      【解决方案5】:

      模拟器使用常规 QuickTime 进行播放,因此很容易让媒体资产在 sim 中工作,但由于缺少/不受支持的编解码器而在设备上失败。测试是您是否可以在设备上播放文件,例如通过 Safari 或 iPod 应用程序。

      【讨论】:

      • 声音确实在 iPhone 的 iPod 上播放。
      • iTunes 重新编码声音以便它可以在设备上播放,尝试通过 Safari 播放。
      猜你喜欢
      • 2015-01-27
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      相关资源
      最近更新 更多