我正在使用以下内容播放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
文件路径是否存在问题或我需要为设备做些什么?
答案 0 :(得分:5)
我也遇到了麻烦。最后我意识到这是因为AudioServices只能播放具有以下限制的音频。
您使用此播放的声音文件 功能必须是: - 持续时间不超过30秒 - 采用线性PCM或IMA4(IMA / ADPCM)格式 - 打包在.caf,.aif或.wav文件中
答案 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应用程序。