Estoy intentando acceder a los datos brutos de un archivo de audio en el iPhone/iPad. Tengo el siguiente código, que es un comienzo básico en el camino que necesito. Sin embargo, estoy perplejo sobre qué hacer una vez que tengo un AudioBuffer.Determinar el número de fotogramas en un Core Audio AudioBuffer
AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:urlAsset error:nil];
AVAssetReaderTrackOutput *assetReaderOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:[[urlAsset tracks] objectAtIndex:0] outputSettings:nil];
[assetReader addOutput:assetReaderOutput];
[assetReader startReading];
CMSampleBufferRef ref;
NSArray *outputs = assetReader.outputs;
AVAssetReaderOutput *output = [outputs objectAtIndex:0];
int y = 0;
while (ref = [output copyNextSampleBuffer]) {
AudioBufferList audioBufferList;
CMBlockBufferRef blockBuffer;
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(ref, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer);
for (y=0; y<audioBufferList.mNumberBuffers; y++) {
AudioBuffer audioBuffer = audioBufferList.mBuffers[y];
SInt16 *frames = audioBuffer.mData;
for(int i = 0; i < 24000; i++) { // This sometimes crashes
Float32 currentFrame = frames[i]/32768.0f;
}
}
}
Esencialmente no sé cómo decirle cuántos fotogramas cada búfer contiene así que no puedo extraer de forma fiable los datos de ellos. Soy nuevo en el trabajo con datos de audio en bruto, por lo que estoy abierto a cualquier sugerencia sobre cómo leer mejor la propiedad mData de la estructura de AudioBuffer. Tampoco he hecho mucho con punteros vacíos en el pasado, así que ayuda con eso en este contexto también sería genial.
¡Excelente pregunta! Tu pregunta ayudó a resolver mi problema similar. – user523234
está filtrando blockBuffer –