【发布时间】:2011-12-03 07:40:24
【问题描述】:
我正在尝试通过AVAudioPlayer 播放 MP3,我认为这很简单。不幸的是,它并不完全有效。这就是我所做的一切:
- 为了测试,我新建了一个iOS应用(Single 在 Xcode 中查看)。
我将 AVFoundation 框架添加到项目中,并将
#import <AVFoundation/AVFoundation.h>添加到ViewController.m我将一个 MP3 文件添加到 Apps 的“Documents”文件夹中。
我将
ViewControllersviewDidLoad:更改为以下内容:
代码:
- (void)viewDidLoad
{
[super viewDidLoad];
NSString* recorderFilePath = [NSString stringWithFormat:@"%@/MySound.mp3", [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]];
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:recorderFilePath] error:nil];
audioPlayer.numberOfLoops = 1;
[audioPlayer play];
//[NSThread sleepForTimeInterval:20];
}
不幸的是,音频显然在开始播放后立即停止。如果我取消注释 sleepForTimeInterval 它会播放 20 秒然后停止。只有在使用 ARC 编译时才会出现此问题,否则,它可以正常工作。
【问题讨论】:
-
您不需要启动另一个线程来播放音频。您是否尝试过提供错误指针以查看是否记录了任何内容?
-
是的,我向 initWithContensOfURL 传递了一个 NSError。不过它保持为零......所以我没有收到任何错误,它只是立即停止播放。
-
你用ARC编译吗?接缝是我能想到的唯一合理的方式,这会导致玩家被释放和释放。
-
ARC 不在 NDA 范围内。 (在这里了解到)只是问您如何解决它或问题出在哪里: viewDidLoad 完成后,没有任何内容指向您的 audioPlayer,因此 ARC 将其释放。你可能为它创建了一个 ivar/property。这行得通吗?
-
是的,这行得通。正确的答案正在路上:)
标签: objective-c ios avfoundation avaudioplayer automatic-ref-counting