iPhone应用程序中不同声音之间的延迟

Posted

技术标签:

【中文标题】iPhone应用程序中不同声音之间的延迟【英文标题】:Latency between different sounds in iPhone application 【发布时间】:2011-06-01 02:23:01 【问题描述】:

我正在尝试制作一个带有一些按钮的小型 iPhone 应用程序来播放 WAV 声音。 我的按钮可以工作,但延迟时间很短(~ 0.5 秒)。

这是我的 .m 文件:

#import "buttonSoundViewController.h"

@implementation buttonSoundViewController
//@synthesize player;

-(IBAction) playSoundA:(id)sender
    NSString *path = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"wav"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


-(IBAction) playSoundB:(id)sender
    NSString *path = [[NSBundle mainBundle] pathForResource:@"b" ofType:@"wav"];
    AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];


- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
    [player release];


-(void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error 


-(void)audioPlayerBeginInterruption:(AVAudioPlayer *)player 


-(void)audioPlayerEndInterruption:(AVAudioPlayer *)player 


- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];


- (void)viewDidUnload 


- (void)dealloc 
    [audioPlayer release];
    [super dealloc];
   

@end

如何避免播放不同声音之间的延迟?

【问题讨论】:

WAV 文件大吗?尝试使用较小的文件类型,看看它是否会缩短加载时间 @Mark No 我的 WAV 文件很轻(1 秒,~ 500 Kb)。 【参考方案1】:

对于小声音(少于 30 秒),使用 Audioservices 确实要快得多。所需的代码也不是很长(但它需要一些好的旧 C)。

#import <AudioToolbox/AudioServices.h>

SystemSoundID soundID = 0;
NSString* str =  [[NSBundle mainBundle] pathForResource:fileName ofType:nil];
CFURLRef soundFileURL = (CFURLRef)[NSURL URLWithString:str ];
OSStatus errorCode = AudioServicesCreateSystemSoundID(soundFileURL, &soundID);
if (errorCode != 0) 
    // Handle failure here

else
    AudioServicesPlaySystemSound(soundID);

您还可以使用以下终端命令优化您的声音(减小它们的大小):

afconvert mysound.caf mysoundcompressed.caf -d ima4 -f caff

【讨论】:

您好,感谢您的回复。我对 Ob-C 的理解不够好,无法理解如何实现音频服务……我是个菜鸟。你认为 Hotpaw2 的把戏对我有用吗?我不知道如何申请。 您只需将 AudioServices.framework 添加到您的 XCode 项目中(在 XCode 4 的项目设置中)。那么上面的代码就可以正常工作了。 谢谢,但我还没有找到 AudioServices.Framework。如果它在 AudioToolbox 中,我添加了这个。或者也许我很愚蠢......我什至不知道如何处理上面的代码......放在哪里,如何链接我的 WAV 文件等。Objective-C 是一场噩梦。我经常使用 .NET 和 Delphi 进行开发,它很直观。不是Objective-C。我浪费了难以置信的时间(整整两天)来寻找基本的东西......我筋疲力尽。我更愿意花钱请人让我成为一个现成的 XCode 项目,通过它我可以理解它是如何安静地工作的。如果有兴趣... 糟糕。抱歉,音频服务的框架名称是 audiotoolbox。上面的代码不适合你吗? 这对我不起作用,直到我将其改为 [NSURL fileURLWithPath:]【参考方案2】:

使用系统声音可以大大简化事情。在文档中查找:AudioServicesCreateSystemSoundID。还有一个“系统声音服务参考文档”讨论了该功能和其他相关功能。这是播放短声音的一种简单而有效的方法。不确定它是否会解决您的延迟问题,但它是一个好的开始。您也可以尝试使用一些不同的声音文件类型。可能存在压缩或未压缩的问题。

【讨论】:

【参考方案3】:

也许你可以看看AppSoundEngine。它解决了延迟问题并大大简化了 System Sound Services 的使用,因为它是 SystemSoundID 和相关 C 函数的 Objective-C 包装器。

您无法从 AVAudioPlayer 获得可接受的延迟(

【讨论】:

感谢您的想法。我会看的:)【参考方案4】:

从 Apple Docs 中获取项目 BubbleLevel 中的 SoundEffect 类

SoundEffect 是一个简单的 Objective-C 音频服务包装器 允许加载和播放声音文件的函数。

类/SoundEffect.m

这将使播放文件变得像

一样简单
  SoundEffect *soundEffect = [SoundEffect soundEffectWithContentsOfFile:@""]
  [soundEffect play];

它还将处理内存释放。 AudioServicesDisposeSystemSoundID(soundID);

【讨论】:

谢谢约翰。我试试看;)【参考方案5】:

一个简单的解决方法就是对 buttonSoundViewController 的 init 方法中的 2 种声音执行 AVAudioPlayer alloc init。那么这 2 个音频播放器就已经准备好在您的按钮代理中播放了。

播放声音最快的方法是使用 RemoteIO 音频单元,但这是一个更高级和复杂的 API。

【讨论】:

谢谢大家,我会看看所有这些回复!我会与这个帖子保持联系。 嗨 Hotpaw2,我找不到放置 AVAudioPlayer alloc init 的位置和方法...我有点迷路了:s @Beny:您是否在视图控制器中创建了实例变量以保存您的 2 个 av 播放器以供以后使用?

以上是关于iPhone应用程序中不同声音之间的延迟的主要内容,如果未能解决你的问题,请参考以下文章

推荐 ipad/iphone 应用使用哪种声音格式?

以编程方式在 iPhone 上创建声音

iPhone应用声音识别?

iPhone 7 顶部和底部扬声器之间的平移声音

Phonegap 插件延迟初始化

在 iPhone 上完美连续播放声音