2012-05-06 3 views
0

В моем приложении у меня есть 52 mp3, и когда я загрузить мой вид контроллера я Alloc все 52 mp3 на этом пути:IOS: AVAudioPlayer

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 ??

ответ

1

Уверен, но будет выделена и подготовлена ​​игра для задержки, так как выделено и подготовлено 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 и вызове play на AVAudioPlayer для этого индекса в массиве AudioPlayers.

Возможно, это не лучший способ сделать что-то, но это может сработать, если вы так потребуете.

0

Это способ использования. Если звук воспроизводится, текущее время является смещением текущей позиции воспроизведения, измеренной в секундах от начала звука. Если звук не воспроизводится, текущее время - это смещение, в котором начинается игра, после вызова метода воспроизведения, измеренного в секундах от начала звука.

Установив это свойство, вы можете найти конкретную точку в звуковом файле или реализовать функции быстрой перемотки вперед и назад. Значение этого свойства монотонно возрастает, когда проигрыватель аудио проигрывает или приостанавливает воспроизведение.

Если к устройству вывода звука подключено более одного аудиоплеера, время устройства продолжает увеличиваться, если хотя бы один из игроков играет или приостанавливается.

Если устройство вывода звука не имеет подключенных аудиоплееров, которые либо воспроизведение или паузы, время устройства возвращается к 0.

Используйте это свойство, чтобы указать «сейчас» при вызове воспроизведения AtTime: метод экземпляра. Путем настройки нескольких аудиоплееров для воспроизведения с заданным смещением от DeviceCurrent Time вы можете выполнить точную синхронизацию, как описано в обсуждении этого метода. Чтобы узнать больше, посетите. enter link description here

6

Это немного сложнее в обращении, но вместо использования AVAudioPlayer используйте AVPlayer. AVPlayer предназначен для воспроизведения AVAssets, которые могут быть предварительно загружены. В частности, вы захотите использовать подкласс AVAsset под названием AVURLAssets, который может загрузить ваш URL-адрес: Loading AVAsset. Затем вы можете использовать AVAsset для создания AVPlayerItem. AVPlayerItem - это облегченная оболочка, которую AVPlayer использует для отслеживания состояния воспроизведения для AVAsset. Хорошая вещь об использовании AVPlayer заключается в том, что он может воспроизводить AVMutableComposition, который сам может содержать несколько AVAssets.AVPlayer также может воспроизводить очередь AVAssets и предоставлять вам информацию о том, когда она начинает воспроизводить новый AVAsset, и какой. Если вы загрузите свои MP3-файлы в кучу AVURlAssets, вы можете загрузить их и сохранить их, создав AVPlayerItem & AVPlayer только в том случае, если вы хотите воспроизвести один (или несколько) MP3-файлов.

AVAudioPlayer предназначен для воспроизведения отдельных файлов, но использует AVAssets (и, возможно, AVPlayer) за кулисами. Это хорошо для простых ситуаций, но что-то более сложное, и вы действительно хотите использовать AVPlayer.

Следует также отметить, что AVPlayerItem & AVPlayer - это легкие объекты. Они не занимают много времени, чтобы создать экземпляр. Он загружает AVAsset, который занимает все время. Таким образом, вы можете свободно создавать и уничтожать объекты AVPlayerItem & AVPlayer по мере необходимости.

И, наконец, AVAsset и AVPlayer иногда полагаются на блоки для уведомлений. Например, вам может потребоваться использовать c-блоки при загрузке AVURLAsset для получения уведомления о том, когда актив будет полностью загружен. Просто имейте в виду, что эти блоки не вызываются в основном потоке. Поэтому, если вы попытаетесь обновить какие-либо элементы пользовательского интерфейса или сделать какие-либо анимации из этого блока, это не сработает правильно. Для этого вам нужно отправить другой блок в основной поток, например: dispatch_async(dispatch_get_main_queue(),^{....update UI element code....});. Для получения дополнительной информации о диспетчерских блоках см. Статьи Concurrency Programming Guide и Block Programming Guide.

Смежные вопросы