我正在使用AVAssetReader读取ipod库资产音频数据并渲染波形图像.这是使用我在回答这个问题时所描述的代码进行的
这有时会发生在AVAudioPlayer实例播放音频的时候.
无论播放的音频是否与正在阅读的资产相同,我点击的那一刻
[reader startReading];
Run Code Online (Sandbox Code Playgroud)
播放的音频"淡出".(好像AVAudioPlayer已被告知停止播放).这很奇怪,因为我实际上并没有播放音频,只是阅读它.
我在SO上搜索并找到了这个可能的解决方案但是我发现这似乎没有解决问题.
注意 - 我能够播放几个AVAudioPlayer实例,并且启动这些实例似乎并没有相互干扰 - 但是
[reader startReading];
Run Code Online (Sandbox Code Playgroud)
甚至会杀死AVAudioPlayer的多个同时实例,导致它们全部同步淡出.
有任何想法吗?
uns*_*zed 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];
}
Run Code Online (Sandbox Code Playgroud)
这是从这里收集的
**编辑**更新****
我已经把它变成了一个也预先初始化音频队列的类(在模拟器和设备中都很有用,因为它消除了第一个音频文件播放的启动延迟.
你可以在这里找到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];
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2595 次 |
| 最近记录: |