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);
【讨论】:
尽量避免使用sleep
,dispatch_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 不播放任何声音的主要内容,如果未能解决你的问题,请参考以下文章
OpenAL vs AVAudioPlayer vs 其他播放声音的技术