AVAudioPlayer 不播放任何声音

Posted

技术标签:

【中文标题】AVAudioPlayer 不播放任何声音【英文标题】:AVAudioPlayer not playing any sound 【发布时间】:2011-12-22 10:31:49 【问题描述】:

我正在开发一个需要使用AVFoundation 框架播放一些声音的ios 应用程序。 Xcode 4 中的工作区结构包含两个项目:

工作区 应用程序本身(主项目) 实用程序库

构建实用程序库后,生成一个静态库,在主应用程序中用作框架。

因此,当尝试使用以下代码在主应用程序中播放声音时,它会按预期工作。

NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *path = [NSString stringWithFormat:@"%@/sound.mp3", resourcePath];

NSURL *url = [NSURL fileURLWithPath:path];
NSError *error = nil;

AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url
                                                                    error:&error];
[audioPlayer play];

相比之下,当尝试使用与上述相同的代码在实用程序库中播放完全相同的声音(或任何其他声音)时,根本不会播放任何声音,即使错误为 nil 并且audioPlayer 属性值是正确的(通道数、持续时间)。

我已确保 AVFoundation 框架在两个项目中。

另外,我的班级使用AVAudioPlayerDelegate 协议并实现了这两种方法:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;

在尝试播放声音后,这些方法都不会被调用。

如果我改用AudioToolbox 框架,那么它会播放声音。但我有兴趣使用AVFoundation 有几个原因。

知道发生了什么吗?我错过了关于AVFoundation 的东西吗?是否与在静态库中使用 AVAudioPlayer 有关?

提前致谢。

【问题讨论】:

你能告诉我们错误变量输出什么吗?来自这里的 AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; @Maudicus,正如我所说,播放声音后错误为零。我找到了解决方案,它与我没有提到也没有考虑过的事情有关:我正在使用 ARC 进行编译。 ARC 向音频播放器插入一个释放调用,因此它在离开创建它的方法后立即被释放,如 here 所述 很抱歉,我复制了您的代码并且它有效。错过了关于错误为零的声明。我很高兴它已经解决了 @Maudicus 没问题。 :) 还是谢谢! 【参考方案1】:

我找到了解决方案,它与我没有提到和没有考虑过的事情有关:我正在使用自动引用计数 (ARC) 进行编译。

ARC 会向音频播放器插入一个释放调用,因此它会在离开创建它的方法后立即释放。它与 AVAudioPlayer 无关,但与 ARC 无关。

为了解决这个问题,我刚刚为处理声音的类创建了一个AVAudioPlayer 属性,这样它就不再被 ARC 发布了。好吧,至少,在这个类的实例被释放之前,它不会被释放。

有关 ARC 的更多信息,请参阅Automatic Reference Counting: Zeroing Weak References,详细了解我遇到此问题的原因。

【讨论】:

我以前也遇到过这种情况,和AVAudioPlayer无关,甚至在遇到AVAudioPlayer莫名其妙不播放声音的问题时,我也忘记了这个解决方案。关于 ARC 的好消息! 我知道这是一个老话题,但与其创建一个新问题来问同样的事情,你能像我五岁一样向我解释一下这是什么意思吗?我做了一个 iOS 应用程序,我有一个提交按钮,当计算完成时,它会播放声音。我首先做了一个简化版本,作为一个运行良好的 OS X 应用程序,但作为一个 iOS 应用程序,使用 AVAudioPlayer 而不是 NSSound 或者它不起作用的东西,50% 的时间会导致应用程序崩溃。跨度> @JonathanWeinraub 很抱歉,但是如果没有看到任何代码就很难判断。您的崩溃和 AVAudioPlayer 问题可能与多种原因有关。 非常感谢。有同样的问题。 我需要多个播放器,因此与多个属性相反,我创建了一个 NSMutableDictionary 并将播放器的键存储为 lastPathComponent。【参考方案2】:

是的,绝对的; ARC 也是我的代码的原因。

我介绍了一个属性:

@property (strong, nonatomic) AVAudioPlayer *audioPlayer;

这让一切顺利。

【讨论】:

你还在做alloc initWithContentsOfUrl吗??【参考方案3】:

使用它肯定会起作用....

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];

NSURL *url = [NSURL fileURLWithPath:@"path of the sound file :)"];
_player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[_player setDelegate:self];
[_player prepareToPlay];
[_player play];

【讨论】:

AVAudioSession 帮了我大忙。没有它,我只能在模拟器中播放声音,而不能在设备上播放。 感谢prepareToPlay 这对我帮助很大!【参考方案4】:

你配置了 AVAudioSession 了吗?

我遇到了类似的问题并使用以下方法修复了它:

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:NULL];

[audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL];

希望对你有帮助。

【讨论】:

我已经回答了 Madicus 关于这个问题,但我没有直接回答我的问题,因为我不能(可能是因为 *** 不允许在最初几个小时内自动回答) /天)。官方答案现在就在这里。 :) 还是谢谢! 将其添加到您的 viewDidLoad 方法中。在录制之后但在播放之前设置会话不起作用。此外,在没有设置会话的情况下,它可以在模拟器上运行,但不能在设备上运行。【参考方案5】:

即使在类范围内声明了 audioPlayer var,它也不会播放。 至少在 iOS 10 iPhone 5c 物理设备上。

play() 结果为true,因此似乎没有发生错误。

必须添加这个 (Swift 3, 4),现在它可以正确播放声音了。

let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayback)

【讨论】:

【参考方案6】:

我为简单的音频播放器创建了开源项目。如果您在 iOS 中播放音频(也在后台)有任何问题,请查看它:https://github.com/wzbozon/DKAudioPlayer

【讨论】:

【参考方案7】:

请在页面上停留一段时间,我遇到了同样的问题。并使用 sleep 来解决它。


NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                                             pathForResource:@"sounds-1027-are-you-kidding"
                                             ofType:@"mp3"]];
        AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc]
                                      initWithContentsOfURL:url
                                      error:nil];
        [audioPlayer play];
        sleep(2);

【讨论】:

尽量避免使用sleepdispatch_after 是更好的选择。 此代码将使 audioPlayer 实例存活 2 秒。这使得代码依赖于音频文件的长度,并且不适用于任何音频文件。此外,它会将调用线程挂起 2 秒,在大多数情况下,这不是预期的行为。 这是一个老套但有创意的解决方案,有其优点和缺点。就我而言,我试图提醒用户注意新信息。在播放提示音的同时冻结 App 中的所有活动一秒钟,实际上是吸引用户注意力的好方法。所以这实际上符合我的需求。它不值得投反对票。【参考方案8】:

我有同样的问题。我已经通过在 .h 文件中添加以下行来解决它:

@property (strong, nonatomic) AVAudioPlayer *audioPlayer;

在 .m 文件中:

NSError *error;
NSString *soundFilePath = [NSString stringWithFormat:@"%@/dancepechance.mp3",
                               [[NSBundle mainBundle] resourcePath]];
    NSURL *url = [NSURL fileURLWithPath:soundFilePath];
    self.audioPlayer = [[AVAudioPlayer alloc]
                                  initWithContentsOfURL:url
                                  error:&error];
    NSLog(@"Error %@",error);
    [self.audioPlayer prepareToPlay];
    [self.audioPlayer play];

【讨论】:

【参考方案9】:

您可以使用 AVKit 中的 AVPlayerViewController 代替音频和视频。代码可用于 swift 和 Objective c here。

【讨论】:

【参考方案10】:

对我来说,这完成了工作

do 
     try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)
     catch 
        assertionFailure("Failed to configure `AVAAudioSession`: \(error.localizedDescription)")
    

【讨论】:

以上是关于AVAudioPlayer 不播放任何声音的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioPlayer 不播放 iPad2

OpenAL vs AVAudioPlayer vs 其他播放声音的技术

使用 AVAudioPlayer 播放声音时出现问题?

AVAudiorecorder 和 AVAudioPlayer 并不总是播放声音

Swift - AVAudioPlayer,声音播放不正确

为啥我的 AVAudioPlayer 不播放声音?