Iphone 模拟器上有声音,但设备上没有声音

Iphone 模拟器上有声音,但设备上没有声音,iphone,cocoa-touch,core-audio,Iphone,Cocoa Touch,Core Audio,我正在使用以下命令播放m4a文件: NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: fileName]; SystemSoundID soundID; NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO]; AudioServicesCreateSystemSoundID((CFURLRef)fileP

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

NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: fileName];
SystemSoundID soundID;
NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];
AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);
AudioServicesPlaySystemSound(soundID);
它在模拟器上运行良好,但我在设备上听不到任何声音。我正在使用的声音文件都保存在包中。以下是设备中的文件路径:

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

文件路径是否有问题,或者我需要为设备执行的任何操作是否不同?

首先检查返回的错误。文件路径是否为零?两个AudioServices函数是否都返回错误?最可能的原因是案例敏感性。iPhone文件系统区分大小写,而Mac则不区分大小写。但调试的第一步是查看系统提供的错误。

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

你可能想使用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框架添加到项目中,则需要将其添加到项目中。以及导入头文件

#导入

音频会话服务

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

AVAudioPlayer类


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

我也遇到了这个问题。最后我意识到这是因为AudioServices只能播放具有以下结构的音频

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


从苹果文档:

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


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

filePath不是零。它具有我在OP中发布的值。我没有看到任何错误发生。您已经检查了OSStatus结果,并且两者都是noErr?如何检查OSStatus结果?AudioServicesCreateSystemSoundID()和AudioServicesPlaySystemSound()返回类型为OSStatus的结果代码(所有音频函数都有)。如果它返回0(noErr),则它是成功的。否则,它是一个负数,表示错误。这里有记录:谢谢。AudioServicesCreateSystemSoundID确实返回0,但AudioServicesPlaySystemSound是无效的。这些声音会在iPhone的iPod上播放。iTunes会重新编码声音,以便它可以在设备上播放,请尝试通过Safari播放。谢谢。我试试看。为什么AudioServices不能播放声音?或者,为什么要使用一个而不是另一个呢?我现在使用的是基于用户事件的AVAudioPlayer(即单击按钮)。如果不是nil,我释放它,创建实例,然后播放。似乎有一点延迟,因为我每次都创建一个实例。有没有更有效的方法?@user230949:您可以制作一个声音对象,类似于,只是您正在为
AVAudioPlayer
制作一个包装器。请确保您的手机没有处于静默模式!我花了两个小时来找出这个。。。