我正在使用AVAssetReader读取ipod库资产音频数据并渲染波形图像。这是使用我在this question
的答案中描述的代码进行的这有时会在AVAudioPlayer实例播放音频时发生。
无论播放的音频是否与正在阅读的资产相同,我点击的时刻
[reader startReading];
播放的音频“淡出”。 (好像AVAudioPlayer已被告知停止播放)。这很奇怪,因为我实际上并没有播放音频,只是阅读它。
我在SO上搜索并找到this possible solution但是我发现这似乎没有解决问题。
注意 - 我可以播放几个AVAudioPlayer实例,并且启动这些实例似乎并没有相互干扰 - 但是
[reader startReading];
甚至会杀死AVAudioPlayer的多个同时实例,导致它们全部同步淡出。
任何想法?
答案 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];
}
}