Sto provando ad estrarre campioni PCM grezzi da un MP3 nella libreria dell'iPod in modo che possa riprodurre la song e manipolare il pitch, il tempo e applicare effetti sonori (come filtri). Ho già seguito il percorso di AVPlayer e AVAudioPlayer, che non consentono affatto il controllo della riproduzione.Estrarre gli esempi di PCM raw della libreria dell'iPod e suonare con gli effetti sonori
Il codice seguente è il massimo che ho ottenuto con questo. Ora sono a un punto in cui non so cosa fare con il CMSampleBufferRef nel mio ciclo while perché non conosco quale framework utilizzare per riprodurre l'audio e applicare tali effetti.
Qualche idea quale sarebbe l'approccio migliore per raggiungere questo obiettivo? Ho esaminato i casi in cui il file viene convertito utilizzando un AVAssetWriter, ma questo non lo taglierà perché il processo richiede troppo tempo. Sicuramente posso solo leggere gli esempi PCM in memoria per la riproduzione senza doverli prima scrivere sul disco?
NB: So che il codice qui sotto fa riferimento a un mp3 all'interno del progetto, ma sono consapevole che questo approccio funzionerà lo stesso come se stessi tirando un NSURL dal 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];
}
eccellente. Questo mi porta a metà strada lì. Ho fatto qualche ricerca sui framework audio e sembra che l'unico framework adatto alle mie esigenze sia OpenAL. Con una curva di apprendimento ripida, questo è leggermente offuscante, ma potrei usare NSData con qualcosa come Finch? – Dino
Non ho mai usato Finch da solo, quindi non sono sicuro che accetti direttamente NSData. –
FYI: L'ho provato, e ho ottenuto EXC_BAD_ACCESS ... Potrei rimuoverlo controllando l'OSStatus restituito da 'CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer' prima di fare il' for'. – Larme