AVAssetReader对AVAudioPlayer的播放有影响

6
我正在使用AVAssetReader读取iPod库资产音频数据并渲染波形图像。这是使用我在回答此问题中描述的代码完成的。
有时,这会在AVAudioPlayer实例播放音频时发生。
无论正在播放的音频是否与正在读取的资产相同,一旦我触发了
[reader startReading];

正在播放的音频“逐渐消失”。(好像已经告诉AVAudioPlayer停止播放)。这很奇怪,因为我实际上并没有在播放音频,只是正在读取它。
我在SO上搜索,并找到了可能的解决方案,但我发现这似乎并不能解决问题。
注意 - 我能够有几个AVAudioPlayer播放实例,并且启动这些实例似乎不会互相干扰 - 但是。
[reader startReading];

甚至会杀死多个同时运行的AVAudioPlayer实例,使它们全部同步淡出。

有什么想法吗?

1个回答

16

回答我自己的问题......

在stackoverflow进一步搜索后,我实现了这个替代方案:

- (void)setupAudio {
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
    UInt32 doSetProperty = 1;
    AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
    [[AVAudioSession sharedInstance] setActive: YES error: nil];
}

这是从这里获取的。

**编辑**更新****

我已经将此转换为一个类,还会预初始化音频队列(无论在模拟器和设备中都很有用,因为它消除了播放第一个音频文件的启动延迟)。

您可以在这里找到point1sec.mp3:http://www.xamuel.com/blank-mp3s/

#import <AVFoundation/AVFoundation.h>
#import "AudioToolbox/AudioServices.h"

@interface sw_AVAudioPlayerSetup : NSObject
 <AVAudioPlayerDelegate> {

}

+ (void)setupAudio ;
+ (void)setupSharedSession ;

@end
@implementation sw_AVAudioPlayerSetup

+ (void)setupSharedSession {

    static BOOL audioSessionSetup = NO;
    if (audioSessionSetup) {
        return;   
    }
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
    UInt32 doSetProperty = 1;

    AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);

    [[AVAudioSession sharedInstance] setActive: YES error: nil];

    audioSessionSetup = YES;

}

+ (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
    // delegate callback to release player
    [player release];
}

+ (void)setupAudio {

    [self setupSharedSession];

    NSString *filepath = [[NSBundle mainBundle]                                                                                                  
                          pathForResource:@"point1sec"                                                                                                 
                          ofType:@"mp3"];

    if ([[NSFileManager defaultManager] fileExistsAtPath:filepath]) {

        AVAudioPlayer* player = [[AVAudioPlayer alloc] 
                                 initWithContentsOfURL:
                                 [NSURL fileURLWithPath:filepath] 
                                 error:nil];

        player.delegate = (id <AVAudioPlayerDelegate>) self;

        [player play];
    }
}

如果你正在使用ARC,音频播放器必须声明为“strong”。否则它可能会被提前释放,你就听不到任何声音了。 - Sten
在iOS 8中,AudioSessionSetProperty已被弃用。 - Gabriel.Massana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接