Extrait Bibliothèque iPod raw PCM échantillons et de jouer avec des effets sonores

Je suis en train de l'extrait brut échantillons PCM à partir d'un MP3 dans la Bibliothèque iPod afin que je puisse jouer la chanson et de manipuler le pitch, tempo, et appliquer des effets sonores (tels que les filtres). J'ai déjà descendu la route de AVPlayer et AVAudioPlayer qui à la fois ne permettent pas beaucoup de contrôle sur la lecture à tous.

Le code ci-dessous est comme ce que j'ai obtenu avec cette. Je suis à un point où je ne sais pas quoi faire avec le CMSampleBufferRef est dans ma boucle while car je ne sais pas qui cadre à utiliser pour la lecture de l'audio et de les appliquer à de tels effets.

Une idée de ce que serait la meilleure approche pour atteindre cette? J'ai regardé le cas où le fichier est converti à l'aide d'un AVAssetWriter mais cela ne va pas le couper pour moi parce que le processus est trop long. Certes, je peux juste lire les échantillons PCM en mémoire pour la lecture sans avoir à les écrire sur le disque en premier?

NB: je sais que le code ci-dessous fait référence à un mp3 dans le projet, mais je suis conscient que cette approche fonctionne de la même comme si je tire un NSURL de la 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];

}

OriginalL'auteur Dino | 2011-01-25