Извлечение необработанных сэмплов PCM из библиотеки iPod и воспроизведение со звуковыми эффектами

Я пытаюсь извлечь необработанные сэмплы PCM из MP3 в библиотеке iPod, чтобы я мог воспроизводить песню и управлять высотой тона, темпом и применять звуковые эффекты (например, фильтры). Я уже пошел по пути AVPlayer и AVAudioPlayer, которые не позволяют полностью контролировать воспроизведение.

Код ниже - это все, что я получил с этим. Я сейчас нахожусь в точке, где я не знаю, что делать с CMSampleBufferRef в моем цикле while, потому что я не знаю, какой фреймворк использовать для воспроизведения звука и применения таких эффектов.

Любая идея, что было бы лучший подход для достижения этого? Я рассмотрел случаи, когда файл конвертировался с помощью AVAssetWriter, но это не поможет мне, потому что процесс занимает слишком много времени. Конечно, я могу просто считывать сэмплы PCM в память для воспроизведения, не записывая их сначала на диск?

NB: Я знаю, что приведенный ниже код ссылается на mp3 в проекте, но я знаю, что этот подход будет работать так же, как если бы я извлекал NSURL из MPMediaPropertyAssetURL


-(IBAction)loadTrack:(id)sender {

 NSString *songPath = [[NSBundle mainBundle] pathForResource:@"Smooth_Sub Focus_192" ofType:@"mp3"];
 NSURL *assetURL = [[NSURL alloc] initFileURLWithPath:songPath];

 AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil];

 NSError *assetError = nil;
 AVAssetReader *assetReader = [[AVAssetReader assetReaderWithAsset:songAsset
                error:&assetError] retain];
 if (assetError) {
  NSLog (@"Error: %@", assetError);
  return;
 }

 AVAssetReaderOutput *assetReaderOutput = [[AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:songAsset.tracks
                           audioSettings: nil] retain];
 if (![assetReader canAddOutput:assetReaderOutput]) {
  NSLog (@"Incompatible Asser Reader Output");
  return;
 }

 [assetReader addOutput: assetReaderOutput];
 [assetReader startReading];

 CMSampleBufferRef nextBuffer;
 while (nextBuffer = [assetReaderOutput copyNextSampleBuffer]) {
  /* What Do I Do Here? */
 }

 [assetReader release];
 [assetReaderOutput release];

}

8
задан Dino 25 January 2011 в 17:11
поделиться