在我的应用程序中,我有52个mp3,当我加载我的视图控制器时,我以这种方式分配所有的52个mp3:
NSString *pathFrase1 = [NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle] resourcePath],[NSString stringWithFormat:@"a%d_1a.mp3",set]];
NSURL *filePath1 = [NSURL fileURLWithPath:pathFrase1 isDirectory:NO];
f1 = [[AVAudioPlayer alloc] initWithContentsOfURL:filePath1 error:nil];
[f1 prepareToPlay];但是当我打开viewcontroller的时候它非常慢,那么有没有办法在我使用它的时候分配mp3呢?并发布其AVAudioPlayer??
发布于 2012-05-06 21:07:19
当然可以,但在分配AVAudioPlayer并准备播放时会有延迟。你能预测什么时候会播放什么吗?如果是这样的话,也许你可以在需要一个特定的mp3之前加载几秒钟。
根据您的时间要求,另一种可能不起作用的替代方法如下:
- (void)prepareAudioPlayer {
static int index = -1;
index = index + 1;
if (index < [[self FileNames] count]) {
NSError *err = nil;
NSString *audioFilePath = @""; // Figure out how to get each file name here
NSURL *audioFileURL = [NSURL fileURLWithPath:audioFilePath];
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:audioFileURL error:&err];
if (err) {
NSLog(@"Audio Player Error: %@", [err description]);
}
[player prepareToPlay];
// Add this player to the "AudioPlayers" array
[[self AudioPlayers] addObject:player];
// Recurse until all players are loaded
[self prepareAudioPlayer];
}
}此解决方案需要FileNames和AudioPlayers的属性。
设置完成后,您可以执行类似以下操作(可能是在viewDidLoad中):
// Make the file name array
[self setFileNames:[NSMutableArray array]];
// Initiate the audio player loading
[self performSelectorInBackground:@selector(prepareAudioPlayer) withObject:nil];稍后,当您需要播放特定文件时,您可以在FileNames数组中找到该文件名的索引,并在AVAudioPlayer上调用AudioPlayers数组中该索引的play。
这似乎不是做事情的最好方法,但如果您需要这样做,它可能会起作用。
发布于 2012-05-06 21:37:10
处理起来有点复杂,但是使用AVPlayer而不是AVAudioPlayer。AVPlayer是为播放AVAssets而设计的,它可以是预加载的文件。具体地说,您需要使用一个名为AVURLAssets的AVAsset子类,它可以加载您的URL:Loading AVAsset。然后,您可以使用AVAsset创建AVPlayerItem。AVPlayerItem是一个轻量级包装器,AVPlayer使用它来跟踪AVAsset的播放状态。使用AVPlayer的好处是它可以播放一个AVMutableComposition,它本身可以包含多个AVAssets。AVPlayer还可以播放AVAssets队列,并向您提供何时开始播放新AVAsset以及播放哪一个新and的信息。如果你把你的mp3加载到一堆AVURlAssets中,你可以加载它们并保留它们,只有当你想要播放一个(或多个)mp3的时候才会创建AVPlayerItem & AVPlayer。
AVAudioPlayer被设计为播放单个文件,但它在幕后使用AVAssets (可能还有AVPlayer)。它对于简单的情况很好,但是对于更复杂的情况,你真的想使用AVPlayer。
我还应该指出,AVPlayerItem和AVPlayer是轻量级对象。它们完全不需要花费很长时间来实例化。它正在加载耗费所有时间的AVAsset。因此,您可以根据需要随意创建和销毁AVPlayerItem和AVPlayer对象。
最后,AVAsset和AVPlayer有时依赖于块来发送通知。因此,例如,在加载AVURLAsset时,您可能需要使用C形块来获取有关资源何时完全加载的通知。请注意,这些块并不是在主线程上调用的。因此,如果您尝试更新任何UI元素或从该块执行任何动画,它都不会正常工作。您需要在主线程上分派另一个块来执行此操作,例如:dispatch_async(dispatch_get_main_queue(),^{....update UI element code....});。有关分派块的更多信息,请参阅苹果的Concurrency Programming Guide和Block Programming Guide。
发布于 2012-05-06 21:32:27
下面是使用方法,如果正在播放声音,则当前时间是当前播放位置的偏移量,从声音开始以秒为单位。如果没有播放声音,则current Time是调用play方法时播放开始的偏移量,以声音开始后的秒数为单位。
通过设置此属性,可以查找到声音文件中的特定点或实现音频快进和倒带功能。当音频播放器正在播放或暂停时,此属性的值单调增加。
如果多个音频播放器连接到音频输出设备,则只要至少有一个播放器正在播放或暂停,设备时间就会继续递增。
如果音频输出设备没有正在播放或暂停的已连接音频播放器,则设备时间将恢复为0。
在调用play AtTime: instance方法时,使用此属性指示“now”。通过将多个音频播放器配置为在deviceCurrent时间的指定偏移量处播放,您可以执行精确同步-如method.To了解更多信息访问的讨论中所述。enter link description here
https://stackoverflow.com/questions/10470503
复制相似问题