【问题标题】:AVAudioPlayer IssueAVAudioPlayer 问题
【发布时间】:2014-03-16 14:40:12
【问题描述】:

关于使用 AVAudio Player 播放超过 1 首歌曲

当第一首歌完成时- (void)audioPlayerDidFinishPlaying:successfully: 被调用。

如果我使用该代码,它就可以工作

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    NSString *tempString = @"/";
    tempString  = [tempString stringByAppendingString:name];
    NSString *path = [NSString stringWithFormat:@"%@",[[NSBundle mainBundle] resourcePath]];
    path = [path stringByAppendingString:tempString];
    NSURL *url = [NSURL fileURLWithPath:path];
    NSError *error;

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

    [AppDelegate getAppdelegate].audioPlayerForPlay = audioPlayer101;
    [[AppDelegate getAppdelegate].audioPlayerForPlay play];
} 

有效

但是,如果我没有将实例放在音频播放器的 perdefined 属性中,它就不会播放。

这是代码

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    NSString *tempString = @"/";
    tempString  = [tempString stringByAppendingString:name];
    NSString *path = [NSString stringWithFormat:@"%@",[[NSBundle mainBundle] resourcePath]];
    path = [path stringByAppendingString:tempString];
    NSURL *url = [NSURL fileURLWithPath:path];
    NSError *error;

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

【问题讨论】:

  • 长话短说(请参阅上面评论中的链接)简而言之,ARC 在您创建它后立即释放您 audioPlayer101;最简单的修复方法是制作 storng ivar,就像在你的第一段代码中一样(你在 AppDelegate 中有 ivar)
  • 在我的场景中,我有多个音频播放器同时播放,我需要每个音频播放器的实例分别。有什么解决方案可以完美实现第二个测试用例。

标签: ios iphone avaudioplayer


【解决方案1】:

ARC 代码

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

将为非 ARC 编译为

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

audioPlayer101一创建就会被释放,因为系统不会自动保留它,释放导致dealloc使播放停止。

如果你像你的代码一样使用instance.audioPlayerForPlay = audioPlayer101;,并且audioPlayerForPlay的属性是strong,那么该播放将被实例保留,所以该播放可以继续播放。可以尝试设置audioPlayerForPlay to beweak`,前面的代码也播放不了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多