【问题标题】:AVAudioPlayer gives no sound outputAVAudioPlayer 没有声音输出
【发布时间】:2012-06-07 01:15:01
【问题描述】:

我已将音频工具箱和 avfoundation 导入我的班级,并将框架添加到我的项目中,并使用此代码播放声音:

- (void)playSound:(NSString *)name withExtension:(NSString *)extension
{
    NSURL* soundUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:name ofType:extension]]; 
    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl error:nil];
    audioPlayer.delegate = self;
    audioPlayer.volume = 1.0;
    [audioPlayer play];
}

我这样称呼它:

[self playSound:@"wrong" withExtension:@"wav"];

但是我的声音为零。

【问题讨论】:

  • soundURL 有效,audioPlayer 不为零?可能会尝试将NSError 对象传递到AVAudioPlayer 的初始化中,看看是否有错误。
  • 在您init 之后,您是audioPlayer 非零吗?如果不使用错误参数,您可能会得到一些有用的帮助...
  • 我已经完成了NSError *err; 并将&err 添加到audioPlayer 并像这样打印它:NSLog(@"%@", err); 而我得到的只是(null)
  • 你的audioPlayer 不是零吗?
  • 您在使用 ARC 吗?我想这是可能的,因为没有人有一个强引用,ARC 可能在加载缓冲区和播放样本的时间里释放了它?

标签: iphone objective-c audio


【解决方案1】:

更新答案:

我有问题。它与 ARC 无关,与 准备比赛。只需对其进行强有力的参考,它就会起作用。

如下用户所述:Kinderchocolate :)

在代码中:

.h
~
@property (nonatomic, strong) AVAudioPlayer *player;


.m
~
@implementation
@synthesize _player = player;

【讨论】:

  • 这会增加什么?文档指出,当调用 play ... this method implicitly calls the prepareToPlay method if the audio player is not already prepared to play.
  • 是的,我也遇到了同样的问题,在禁用特定文件的 arc 并获得声音后
【解决方案2】:

是的,ARC 也是我的问题。 我解决了只是添加:

在.h中

@property (strong, nonatomic) AVAudioPlayer *player;

在.m中

@synthesize player;

-(void)startMusic{
    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Riddls" ofType:@"m4a"];
    NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
    player.numberOfLoops = -1; //infinite
    [player play];
}

【讨论】:

  • 谢谢,这也解决了我的问题。让我感到困惑的是,即使 ARC 已经发布了数据,AVAudioPlayer 仍会在音频剪辑的持续时间内播放。更奇怪的是,在那段时间我可以在耳机上听到无声的嘶嘶声。
  • 如果您不想为音频播放器声明强属性,您可以简单地创建一个指向它的static 指针。这将在内存中保留足够长的时间以完成声音播放,即使在其声明的作用域退出之后也是如此。
【解决方案3】:

我有问题。它与 ARC 相关,与 prepareForPlay 无关。只需对它进行强有力的引用,它就会起作用。

【讨论】:

  • 您所说的强引用到底是什么意思?
  • AVAudioPlayer *audioPlayer = ... 在原始代码中。函数结束后,audioPlayer 被释放。您需要对实例进行强引用。
  • 这也吸引了我。当然是 ARC 的一个恼人的错误/功能/方面。我正在记录我有一个播放器对象,没有错误对象,该文件存在于 URL 中,并记录了在调用 [player play] 之后播放器仍然存在并且没有声音。我猜实际的播放是在另一个线程上,当开始播放时,播放器 obj 引用为零,感谢 ARC。
【解决方案4】:

如果你在像-viewDidLoad这样的类方法中声明你的AVAudioPlayer,并且ARC是开启的,播放器将在-viewDidLoad之后立即被释放并变为nil,(-(BOOL)play方法不会阻塞线程)这将发生在毫秒,明显的“nil”不能播放任何东西,所以你甚至听不到声音。

最好将播放器声明为 ViewController 的 @property 或将其设置为全局单例,任何东西都可以持续更长时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多