que estoy tratando de extraer muestras de PCM en bruto de un MP3 en la biblioteca del iPod para que pueda reproducir la canción y manipular el terreno de juego, el tempo, y aplicar efectos de sonido (como filtros). Ya he bajado la ruta de AVPlayer y AVAudioPlayer, que no permiten mucho control sobre la reproducción.Extraer muestras de PCM en bruto biblioteca del iPod y jugar con los efectos de sonido
El código siguiente es por lo que yo he conseguido con esto. Estoy en un punto en el que no sé qué hacer con los de CMSampleBufferRef en mi bucle de tiempo porque no sé qué marco para utilizar con el fin de reproducir el audio y aplicar tales efectos.
Cualquier idea de cuál sería el mejor método para lograr esto? He visto casos en los que el archivo se convierte utilizando un AVAssetWriter, pero esto no va a ser suficiente porque el proceso consume demasiado tiempo. ¿Debo simplemente leer las muestras de PCM en la memoria para reproducirlas sin tener que escribirlas primero en el disco?
NB: Sé que el código de abajo hace referencia a un mp3 en el proyecto, pero soy consciente de que este enfoque funcionará de la misma como si estuviera sacando una NSURL del 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];
}
excelente. Esto me lleva a mitad de camino allí. He estado investigando sobre marcos de audio y parece que el único marco que se ajusta a mis requisitos es OpenAL. Con una curva de aprendizaje empinada esto es un poco desagradable, pero ¿podría usar NSData con algo como Finch? – Dino
Nunca he usado Finch, por lo que no estoy seguro si acepta directamente NSData. –
FYI: Yo probé, y me dieron EXC_BAD_ACCESS ... podría quitarlo marcando la OSStatus devuelto por 'CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer' antes de hacer el' for'. – Larme