在模拟器上发出声音但不是设备

时间:2010-01-06 16:49:52

标签: iphone cocoa-touch core-audio

我正在使用以下内容播放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

文件路径是否存在问题或我需要为设备做些什么?

5 个答案:

答案 0 :(得分:5)

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

  

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

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

答案 1 :(得分:5)

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

为了增加混乱,这个应用程序使用文本到语音,来自听写的音量非常好,只有来自AudioServicesPlaySystemSound()的声音没有被播放。

答案 2 :(得分:2)

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

以下代码将采用音频文件(.m4a)并播放音频文件一次。完成后不要忘记发布“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的核心音频概述Document

音频会话服务

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

AVAudioPlayer类

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

模拟器使用常规QuickTime进行播放,因此很容易使媒体资产在SIM卡中运行,但由于丢失/不支持的编解码器而导致设备失败。测试是你可以在设备上播放文件,例如通过Safari或iPod应用程序。