AVAssetReader杀死播放(在AVAudioPlayer中)

时间:2011-09-14 05:48:15

标签: avaudioplayer

我正在使用AVAssetReader读取ipod库资产音频数据并渲染波形图像。这是使用我在this question

的答案中描述的代码进行的

这有时会在AVAudioPlayer实例播放音频时发生。

无论播放的音频是否与正在阅读的资产相同,我点击的时刻

[reader startReading];

播放的音频“淡出”。 (好像AVAudioPlayer已被告知停止播放)。这很奇怪,因为我实际上并没有播放音频,只是阅读它。

我在SO上搜索并找到this possible solution但是我发现这似乎没有解决问题。

注意 - 我可以播放几个AVAudioPlayer实例,并且启动这些实例似乎并没有相互干扰 - 但是

[reader startReading];

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

任何想法?

1 个答案:

答案 0 :(得分:15)

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

进一步搜索SO让我实现了这个替代解决方案:

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

这是从here

收集的

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

我已经把它变成了一个预先初始化音频队列的类(在模拟器和设备中都很有用,因为它消除了第一个音频文件播放的启动延迟。

你可以在这里找到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];
    }
}