首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IOS: AVAudioPlayer

IOS: AVAudioPlayer
EN

Stack Overflow用户
提问于 2012-05-06 20:31:29
回答 3查看 4.7K关注 0票数 0

在我的应用程序中,我有52个mp3,当我加载我的视图控制器时,我以这种方式分配所有的52个mp3:

代码语言:javascript
复制
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??

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-06 21:07:19

当然可以,但在分配AVAudioPlayer并准备播放时会有延迟。你能预测什么时候会播放什么吗?如果是这样的话,也许你可以在需要一个特定的mp3之前加载几秒钟。

根据您的时间要求,另一种可能不起作用的替代方法如下:

代码语言:javascript
复制
- (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];
    }
}

此解决方案需要FileNamesAudioPlayers的属性。

设置完成后,您可以执行类似以下操作(可能是在viewDidLoad中):

代码语言:javascript
复制
// Make the file name array 
[self setFileNames:[NSMutableArray array]];
// Initiate the audio player loading
[self performSelectorInBackground:@selector(prepareAudioPlayer) withObject:nil];

稍后,当您需要播放特定文件时,您可以在FileNames数组中找到该文件名的索引,并在AVAudioPlayer上调用AudioPlayers数组中该索引的play

这似乎不是做事情的最好方法,但如果您需要这样做,它可能会起作用。

票数 1
EN

Stack Overflow用户

发布于 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 GuideBlock Programming Guide

票数 6
EN

Stack Overflow用户

发布于 2012-05-06 21:32:27

下面是使用方法,如果正在播放声音,则当前时间是当前播放位置的偏移量,从声音开始以秒为单位。如果没有播放声音,则current Time是调用play方法时播放开始的偏移量,以声音开始后的秒数为单位。

通过设置此属性,可以查找到声音文件中的特定点或实现音频快进和倒带功能。当音频播放器正在播放或暂停时,此属性的值单调增加。

如果多个音频播放器连接到音频输出设备,则只要至少有一个播放器正在播放或暂停,设备时间就会继续递增。

如果音频输出设备没有正在播放或暂停的已连接音频播放器,则设备时间将恢复为0。

在调用play AtTime: instance方法时,使用此属性指示“now”。通过将多个音频播放器配置为在deviceCurrent时间的指定偏移量处播放,您可以执行精确同步-如method.To了解更多信息访问的讨论中所述。enter link description here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10470503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档