IOS:AVAudioPlayer
在我的应用程序中,我有52个mp3,当我加载视图控制器时,我以这种方式分配所有52个mp3:IOS:AVAudioPlayer,ios,avaudioplayer,Ios,Avaudioplayer,在我的应用程序中,我有52个mp3,当我加载视图控制器时,我以这种方式分配所有52个mp3: NSString *pathFrase1 = [NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle] resourcePath],[NSString stringWithFormat:@"a%d_1a.mp3",set]]; NSURL *filePath1 = [NSURL fileURLWithPath:pathFrase1 isDire
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???当然,但会有一个延迟,因为
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];
}
}
稍后,当您需要播放特定文件时,您可以在文件名
数组中找到文件名的索引,并在AVAudioPlayer
上为audioplayer
数组中的该索引调用play
这似乎不是最好的方法,但如果您需要,它可能会起作用。以下是使用方法,如果声音正在播放,当前时间是当前播放位置的偏移量,以秒为单位从声音开始测量。如果声音未播放,则当前时间是调用播放方法时播放开始位置的偏移量,从声音开始算起,以秒为单位 通过设置此属性,可以查找声音文件中的特定点,或实现音频快进和快退功能。 当音频播放器播放或暂停时,此属性的值单调增加 如果有多个音频播放器连接到音频输出设备,则只要至少有一个播放器正在播放或暂停,设备时间就会继续增加 如果音频输出设备未连接正在播放或暂停的音频播放器,则设备时间将恢复为0
调用play AtTime:instance方法时,使用此属性指示“now”。通过将多个音频播放器配置为在设备当前时间的指定偏移处播放,您可以按照该方法讨论中所述执行精确同步。要了解更多信息,请访问..它的处理稍微复杂一些,但不要使用AVAudioPlayer,而是使用。AVPlayer设计用于播放,可以预加载文件。具体来说,您需要使用名为的AVAsset的子类,它可以加载您的URL:。然后可以使用AVAsset创建一个。AVPlayerItem是一个轻量级包装器,AVPlayer使用它跟踪AVAsset的播放状态。使用AVPlayer的好处是它可以播放一个,它本身可以包含多个avasset。AVPlayer还可以播放AVAsset队列,并向您提供有关何时开始播放新AVAsset以及播放哪个AVAsset的信息。如果您将MP3加载到一堆AVURL资源中,您可以加载它们并保留它们,仅当您想播放一个(或多个)MP3时才创建AVPlayerItem&AVPlayer AVAudioPlayer设计用于播放单个文件,但它在幕后使用AVAssets(可能还有AVPlayer)。这对于简单的情况很好,但是任何更复杂的情况下,你都想使用AVPlayer 我还应该指出,AVPlayerItem和AVPlayer是重量较轻的对象。实例化它们根本不需要很长时间。加载AVAsset需要花费所有的时间。因此,您可以根据需要随意创建和销毁AVPlayerItem和AVPlayer对象 最后,AVAsset和AVPlayer有时依赖块进行通知。因此,例如,在加载AVURLAsset时,您可能需要使用c-blocks,以便在资源完全加载时获得通知。请注意,这些块不是在主线程上调用的。因此,如果您试图更新任何UI元素或从该块执行任何动画,它将无法正常工作。您需要将另一个块分派到主线程以执行此操作,例如:
dispatch\u async(dispatch\u get\u main\u queue(),^{……更新UI元素代码……})代码>。有关调度块的更多信息,请参阅Apple的和
// Make the file name array
[self setFileNames:[NSMutableArray array]];
// Initiate the audio player loading
[self performSelectorInBackground:@selector(prepareAudioPlayer) withObject:nil];