AVAudioPlayer没有播放任何声音

mso*_*ler 58 audio objective-c avfoundation xcode4 automatic-ref-counting

我正在开发一个需要使用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];
Run Code Online (Sandbox Code Playgroud)

相反,当尝试使用与上面相同的代码在实用程序库中播放完全相同的声音(或任何其他声音)时,即使错误为nilaudioPlayer属性值为正确,也不会播放任何声音(数字)频道,持续时间).

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

此外,我的类使用AVAudioPlayerDelegate协议并实现这两个方法:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;
Run Code Online (Sandbox Code Playgroud)

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

如果我使用AudioToolbox框架,那么它会播放声音.但AVFoundation由于几个原因,我对使用感兴趣.

怎么知道发生了什么?我错过了什么AVFoundation吗?它可能与AVAudioPlayer在静态库中使用有关吗?

提前致谢.

mso*_*ler 154

我找到了解决方案,它与我没有提及但没有考虑的事情有关:我正在编译自动引用计数(ARC).

ARC向音频播放器插入一个释放调用,因此在离开创建它的方法后立即取消分配.它AVAudioPlayer与ARC 没有任何关系.

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

有关ARC的更多信息,请参阅自动引用计数:归零弱引用,并详细说明我遇到此问题的原因.


uem*_*uem 35

是的,一点没错; ARC也是我的代码的原因.

我介绍了一个属性:

@property (strong, nonatomic) AVAudioPlayer *audioPlayer;
Run Code Online (Sandbox Code Playgroud)

这使得一切都很好.


Ans*_*hul 26

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

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];
Run Code Online (Sandbox Code Playgroud)

  • `AVAudioSession`为我做了伎俩.没有它,我只能在模拟器中播放声音,而不是在设备上播放声音. (3认同)

nan*_*ano 17

你配置了AVAudioSession吗?

我有一个类似的问题,并使用这样的东西修复它:

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:NULL];
Run Code Online (Sandbox Code Playgroud)

要么

[audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL];
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.


Vit*_*lov 6

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

play()结果是true没有错误出现。

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

let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayback)
Run Code Online (Sandbox Code Playgroud)