videos sonido silenciar sacar ruido quitar para los grabar eliminar como app iphone objective-c cocoa-touch avfoundation

iphone - sonido - Lectura de muestras de audio a través de AVAssetReader



sacar audio de video iphone (3)

Las respuestas aquí no son genéricas. La llamada a CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer puede fallar cuando AudioBufferList necesita tener un tamaño diferente. Al tener muestras no intercaladas como ejemplo.

La forma correcta es llamar dos veces a CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer . La primera llamada consulta el tamaño necesario para AudioBufferList y la segunda en realidad llena el AudioBufferList .

size_t bufferSize = 0; CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer( sampleBuffer, &bufferSize, NULL, 0, NULL, NULL, 0, NULL ); AudioBufferList *bufferList = malloc(bufferSize); CMBlockBufferRef blockBuffer = NULL; CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer( sampleBuffer, NULL, bufferList, bufferSize, NULL, NULL, kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, &blockBuffer ); // handle audio here free(bufferList); CFRelease(blockBuffer);

En un ejemplo del mundo real, debe realizar el manejo de errores y, además, no debe malloc cada fotograma, en su lugar debe AudioBufferList en caché AudioBufferList .

¿Cómo lees las muestras de audio a través de AVAssetReader? He encontrado ejemplos de duplicación o mezcla con AVAssetReader, pero esos bucles siempre están controlados por el bucle AVAssetWriter. ¿Es posible simplemente crear un AVAssetReader y leerlo, obtener cada muestra y lanzar el int32 de cada muestra de audio en una matriz?

Gracias.


Para ampliar la respuesta de @amrox, puede obtener un AudioBufferList del CMBlockBufferRef, por ejemplo

CMItemCount numSamplesInBuffer = CMSampleBufferGetNumSamples(buffer); AudioBufferList audioBufferList; CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer( buffer, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, &buffer ); for (int bufferCount=0; bufferCount < audioBufferList.mNumberBuffers; bufferCount++) { SInt16* samples = (SInt16 *)audioBufferList.mBuffers[bufferCount].mData; for (int i=0; i < numSamplesInBuffer; i++) { // amplitude for the sample is samples[i], assuming you have linear pcm to start with } } //Release the buffer when done with the samples //(retained by CMSampleBufferGetAudioBufferListWithRetainedblockBuffer) CFRelease(buffer);


AVAssetReader *reader = [[AVAssetReader alloc] initWithAsset:asset error:&error]; AVAssetTrack *track = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; NSDictionary *settings = @{ AVFormatIDKey : [NSNumber numberWithInt:kAudioFormatLinearPCM] }; AVAssetReaderTrackOutput *readerOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track outputSettings:settings]; [reader addOutput:readerOutput]; [reader startReading]; CMSampleBufferRef sample = [readerOutput copyNextSampleBuffer]; while ( sample ) { sample = [readerOutput copyNextSampleBuffer]; if ( ! sample ) { continue; } CMBlockBufferRef buffer = CMSampleBufferGetDataBuffer(sample); size_t lengthAtOffset; size_t totalLength; char *data; if ( CMBlockBufferGetDataPointer( buffer, 0, &lengthAtOffset, &totalLength, &data ) != noErr ) { NSLog(@"error!"); break; } // do something with data... CFRelease(sample); }