AVAudioPlayer在iOS7上无法工作

4
我已经尝试了这里提供的所有不同选项,甚至使用NSData来加载音频文件。我尝试了mp3,m4a和caf文件,但什么都没有有效果。
没有错误消息,没有任何提示。
这是一个使用XCODE 5,iOS7的新应用程序。
这是我正在使用的内容。
- (void)playOnce:(NSString *)aSound
{


    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];
    [audioSession setActive:YES error:nil];

    // Gets the file system path to the sound to play.
    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:aSound ofType:@"m4a"];

    // Converts the sound's file path to an NSURL object
    NSURL *soundURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
    AVAudioPlayer * newAudio=[[AVAudioPlayer alloc] initWithContentsOfURL: soundURL error:nil];


    [newAudio prepareToPlay];

    // set it up and play
    [newAudio setNumberOfLoops:0];
    [newAudio setVolume: 1];
    [newAudio setDelegate: self];
    [newAudio play];

}

非常感谢您的帮助。我已经被这些问题困扰很久了。

提前感谢您的帮助。


具体是什么出了问题?你说没有错误,那问题是什么?你听不到音频吗?你是在使用模拟器还是设备? - ajeetdl
实际上什么都没有发生。没有声音,也没有其他反应。在模拟器和设备上都是如此。我使用了一个按钮来触发播放,该按钮会在几秒钟内变为禁用状态,然后再次启用,但是没有任何声音。 - Elkucho
我也添加了以下代码但仍无法运行...AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; [audioSession setActive:YES error:nil]; - Elkucho
在上面的代码中,你立即开始使用 [newPlayer Play] 进行操作,所以如果你正在使用一个按钮,那么这不是你实际使用的代码吗?你是否调试过按钮是否按照你想象的那样工作,例如在适当的位置设置一些断点。 - ajeetdl
是的,我进行了调试并且它通过了所有代码行。在[newPlayer Play]之后,没有任何反应。我认为这可能是一个委托问题。与其他一些代码进行比较,我缺少了newPlayer.Delegate = self; 我将尝试这样做,但同时如果您有任何想法,请分享。感谢迄今为止的回复。 - Elkucho
对我来说仍然不行。我确实忘记了<AVAudioDelegate>,但仍然无法工作。我正在编辑帖子并添加整个代码。仍然感到迷茫,任何帮助都将不胜感激。 - Elkucho
2个回答

17
您需要在视图控制器中将AVAudioPlayer声明为强引用的@property,就像下面这样。
@property (strong, nonatomic)  AVAudioPlayer * newAudio;
如果你在一个方法中声明AVAudioPlayer,那么它将在方法执行完毕后立即被释放,没有足够的时间来播放声音。

2

我尝试了这样做,成功在iOS 7上播放音频文件。

- (void)viewDidLoad {
  [super viewDidLoad];

  NSURL* url = [[NSBundle mainBundle] URLForResource:@"DR" withExtension:@"mp3"];
  NSAssert(url, @"URL is valid."); 
  NSError* error = nil;
  self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
  if(!self.player) {
    NSLog(@"Error creating player: %@", error);
  }
  self.player.delegate = self;
  [self.player prepareToPlay];
}

- (IBAction)playAction:(id)sender {
   [self.player play];
}

self.player与将其声明为强属性相同。ARC要求其范围超出此方法,否则它将被释放。 - Peter B. Kramer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接