Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IOS:AVAudioPlayer_Ios_Avaudioplayer - Fatal编程技术网

IOS:AVAudioPlayer

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

在我的应用程序中,我有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???

当然,但会有一个延迟,因为
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];