【问题标题】:MP3 playing using AVAudioPlayer not working on device使用 AVAudioPlayer 播放 MP3 无法在设备上运行
【发布时间】:2011-06-06 04:01:36
【问题描述】:

我正在装有 iOS 4.2 的 3GS iPhone 上测试我的应用

我正在使用以下代码在我的 IBAction 中播放声音。它在模拟器(iPad 和 iPhone)中完美运行 - 我听到了声音。

NSString *pathToMusicFile1 = [[NSBundle mainBundle] pathForResource:@"alarm" ofType:@"mp3"];
NSError *error;
alarmSound = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:pathToMusicFile1] error:&error]; 
NSLog(@"Song1 Loaded");
if (alarmSound == nil) {
    NSLog(@"Error playing sound");
} else {
    alarmSound.numberOfLoops = 20;
    alarmSound.volume = 1.0;
    [alarmSound play];
}

我已经正确声明了所有内容(标题和框架等),因为我可以在模拟器中听到声音。

我还检查了我的手机没有处于静音模式!!我从通用 iphone GUI 听到其他声音。 (来自日期选择器的示例)。

我还清理了所有目标并删除了要重新安装的应用程序。

任何想法有什么问题吗?!

【问题讨论】:

    标签: iphone iphone-sdk-3.0 ios4 avaudioplayer


    【解决方案1】:

    您是否尝试过[NSURL URLWithString:pathToMusicFile1]; 而不是fileURLWithPath:

    【讨论】:

      【解决方案2】:

      将“audioPlayer”变量作为属性非常重要。否则,使用 ARC,它会在有机会播放之前被释放!

      我花了半个小时在谷歌上搜索了这个“哈哈”的时刻。

      我的声音现在完美!

      【讨论】:

      • 在头疼了整整一个小时后,我终于找到了这篇文章。谢谢。
      • 太棒了!你让我今天一整天都感觉很好! :)
      【解决方案3】:

      我的问题是 iOS 在文件有机会播放之前自动释放了我的 AVAudioPlayer 实例。奇怪的是,这只发生在 MP3 而不是 AU 文件中。解决方法是不要将其设置为自动释放,然后在委托方法中释放它...

      - (void)playSound:(NSString *)sound
      {
          AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:sound ofType:@""]] error:NULL];
          audioPlayer.delegate = self;
          [audioPlayer play];
      }
      

      ...然后在委托方法中...

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

      ...现在效果很好。

      【讨论】:

      • ARC 在播放器播放之前释放了它。将播放器设置为属性为我解决了这个问题。
      • ARC 也为我造成了同样的事情,并将其作为属性解决了它。干杯安迪。
      • 我也遇到过同样的问题,这很有效。
      【解决方案4】:

      所以,我也遇到了这个问题 - 我很确定这是同一个问题......

      我们在应用商店中有一个应用已经有一年左右的时间了,最​​近我们需要更改一些内容,尽管没有任何功能。

      声音突然停止工作 - 最新 sdk 版本(4.0 版)和设备上的模拟器(再次运行 iOS 4)。

      一直为我们工作的代码是这样的......

      NSString *sound_file;
      if ((sound_file = [[NSBundle mainBundle] pathForResource:@"track1" ofType:@"mp3"])){
      
      NSURL *url = [[NSURL alloc] initFileURLWithPath:sound_file];
      audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL];
      audioPlayer.delegate = self;
      [url release];
      
      [audioPlayer prepareToPlay];
      [audioPlayer play];
      
      }
      

      最后,我发现您现在需要设置 AVAudioSession 播放的类型,只是为了让声音像以前一样通过扬声器播放!将以下代码行放入您的应用委托 applicationDidFinishLaunching 事件处理程序...

      - (void)applicationDidFinishLaunching:(UIApplication *)application {
      
          [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
      

      不要忘记在您的应用程序委托 .h 文件中添加包含(如果尚未这样做,显然您还需要导入 AVFoundation 框架)...

      #import <AVFoundation/AVAudioSession.h>
      

      希望现在可以让您的声音在设备上播放。

      不要被我认为可能是一个单独的问题所吸引,那就是声音仍然无法在模拟器中播放。我看过其他帖子暗示这是这种情况,但我不确定这种情况有多普遍。我发现如果我选择 iPad 3.2 作为我的模拟器,它至少可以解决这个问题。快乐!

      在我看来很疯狂的是,这肯定会影响到很多人,但很难找到关于应该是众所周知的问题的信息或建议 - 毕竟,我已经看过很多帖子在似乎没有人回答的论坛上。

      无论如何,希望这对其他人有帮助。

      【讨论】:

      • 哇,这 1 对我有用,我遇到了同样的问题,thanx @Jon Andrews!
      • 代码 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 只是覆盖静音开关,让您在手机锁定 AFAIK 时播放声音。
      • 终于!花了一个小时的谷歌搜索、转换、导入、尝试,这终于奏效了。非常感谢!
      • 我希望我能 +100。非常感谢@Jon。
      • 太棒了!我可以解决类似的问题。就我而言,它在 ios5 设备上不起作用,但模拟器没问题。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多