在 viewDidLoad 上播放声音 - Xcode

Posted

技术标签:

【中文标题】在 viewDidLoad 上播放声音 - Xcode【英文标题】:Playing sound on viewDidLoad - Xcode 【发布时间】:2014-05-30 18:52:27 【问题描述】:

我在加载视图时遇到了一个小问题(如果此代码有效,最终会在执行其他操作时播放声音)

问题:加载视图时手机上没有播放声音。但是,如果我在添加 breakpoint 后单步执行代码,我可以听到 iPhone 发出的声音:

[click play]

我从一个在线教程中获得了以下代码,并将其复制到我的 viewDidLoad 方法中:

- (void)viewDidLoad

    [super viewDidLoad];

    NSURL* musicFile = [NSURL fileURLWithPath:[[NSBundle mainBundle]                                                                                                                  pathForResource:@"States" ofType:@"mp3"]];
    AVAudioPlayer *click  = [[AVAudioPlayer alloc] initWithContentsOfURL:musicFile  error:nil];
    [click play]; // Breakpoint is here


我做过的事情:

在我的头文件中导入了 AudioToolbox/AudioToolbox.hAVFoundation/AVFoundation.h 在有断点和没有断点的情况下执行代码 --> 有了断点和单步执行,我可以听到声音;没有我不能。

如果我能得到一些建议或意见来尝试它,我将不胜感激。甚至是在我的应用程序中实现音频的另一种方式

谢谢。

【问题讨论】:

尝试 viewdidappear 一次 您最好将 click 添加为类的属性 【参考方案1】:

您的音频播放器对象“click”将在 viewDidLoad 完成后立即释放,因为它已分配给局部变量。您需要为您的播放器创建一个 ivar 或属性。

【讨论】:

【参考方案2】:

musicFile 不包含音乐文件(或者实际上是任何文件)的 URL。它包含应用程序本身的 URL。您想要做的是更多类似的事情:

musicFile = [[NSBundle mainBundle] URLForResource:@"musicFile" withExtension:@"caf"];

另外,对于播放小的短音频片段,您可能只想使用Audioservices

一次性初始化(在 viewDidLoad 中,或静态):

static SystemSoundID    sound;
static dispatch_once_t  onceToken;

dispatch_once(&onceToken, ^
    NSURL*      url = [[NSBundle mainBundle] URLForResource:@"statusChanged" withExtension:@"caf"];
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &sound);
);

然后播放声音:

AudioServicesPlaySystemSound(sound);

【讨论】:

以上是关于在 viewDidLoad 上播放声音 - Xcode的主要内容,如果未能解决你的问题,请参考以下文章

快速自动播放声音

如何在 iOS 中播放声音?

如何在 Swift 2 中播放声音文件

iOS 7 无法播放系统声音

使用 iPhone SDK 同时播放和录制声音?

如何播放声音以创建弹奏效果?