.m4a datos sin procesar de la biblioteca de iPod no se reproducen

Así que me enfrento a un problema muy extraño y extraño y me preguntaba si alguien más se ha encontrado con este problema. Estoy agarrando los datos sin procesar de MPMediaItem de la biblioteca de música de los teléfonos y luego enviándolos a través de HTTP para que se reproduzcan en otros lugares. Cuando mi problema está surgiendo es cuando estoy agarrando los datos sin procesar de un file de tipo .m4a, parece que faltan piezas. Por ejemplo, si el file original que verifico desde iTunes es de 7,4 m, lo que me sale de mi código es de tamaño 7,3 mb. Hice un poco de investigación y encontré que un file .m4a es en realidad una encapsulación y creo que no estoy obteniendo la encapsulación del file solo de los datos de música sin procesar, por lo que no es reconocible. Aquí está mi código que me da los datos de música sin procesar del MPMediaItem

NSError * error = nil; MPMediaQuery *query = [MPMediaQuery albumsQuery]; NSArray * songs = query.items; MPMediaItem * song = [songs objectAtIndex:socket_data_index]; AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:[song valueForProperty:MPMediaItemPropertyAssetURL] options:nil]; AVAssetReader * reader = [[AVAssetReader alloc] initWithAsset:songAsset error:&error]; AVAssetTrack * songTrack = [songAsset.tracks objectAtIndex:0]; AVAssetReaderTrackOutput * output = [[AVAssetReaderTrackOutput alloc] initWithTrack:songTrack outputSettings:nil]; [reader addOutput:output]; [output release]; [reader startReading]; while (reader.status == AVAssetReaderStatusReading) { AVAssetReaderTrackOutput * trackOutput = (AVAssetReaderTrackOutput *)[reader.outputs objectAtIndex:0]; CMSampleBufferRef sampleBufferRef = [trackOutput copyNextSampleBuffer]; if (sampleBufferRef) { CMBlockBufferRef blockBufferRef = CMSampleBufferGetDataBuffer(sampleBufferRef); size_t length = CMBlockBufferGetDataLength(blockBufferRef); NSMutableData * data = [[NSMutableData alloc] initWithLength:length]; CMBlockBufferCopyDataBytes(blockBufferRef, 0, length, data.mutableBytes); [data_to_return appendData:data]; [data release]; CMSampleBufferInvalidate(sampleBufferRef); CFRelease(sampleBufferRef); } } if (reader.status == AVAssetReaderStatusFailed || reader.status == AVAssetReaderStatusUnknown) { // Something went wrong. Handle it. } if (reader.status == AVAssetReaderStatusCompleted) { return [[[HTTPDataResponse alloc] initWithData:data_to_return] autorelease]; } [reader release]; 

Lo hago y obtendré los datos correctos para los files .mp3 que están en la biblioteca de teléfonos, pero cuando se trata de .m4a parece faltar algunas partes.

Gracias de nuevo por tomarte tu time para ayudarme.

Tuve el mismo problema. AVAssetReader devuelve solo los datos de audio sin procesar. Funciona para .mp3 porque el formatting de file es solo un grupo de fotogtwigs que contienen todo lo que un jugador necesita para reproducir el file. Puede observar que falta toda la información id3 en el file exportado.

Los files de audio .m4a son contenedores que envuelven los datos de audio de AAC. Recibió solo los datos de audio, sin más información, es decir, samplerate o la tabla de búsqueda.

Una solución para su problema podría ser utilizar una AVAssetExportSession para exportar AVAssetTrack a un file en el teléfono y transmitir el file desde allí. Intenté exactamente esto y se escribió un file .m4a en funcionamiento.

El siguiente código se basa en el ejemplo de las manzanas cómo exportar un activo de audio recortado :

 // create the export session AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset: songAsset presetName:AVAssetExportPresetAppleM4A]; if (nil == exportSession) NSLog(@"Error"); // configure export session output with all our parameters NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; NSString *filePath = [NSString stringWithFormat: @"%@/export.m4a", basePath]; exportSession.outputURL = [NSURL fileURLWithPath: filePath]; // output path exportSession.outputFileType = AVFileTypeAppleM4A; // output file type [exportSession exportAsynchronouslyWithCompletionHandler:^{ if (AVAssetExportSessionStatusCompleted == exportSession.status) { NSLog(@"AVAssetExportSessionStatusCompleted"); } else if (AVAssetExportSessionStatusFailed == exportSession.status) { // a failure may happen because of an event out of your control // for example, an interruption like a phone call comming in // make sure and handle this case appropriately NSLog(@"AVAssetExportSessionStatusFailed"); } else { NSLog(@"Export Session Status: %d", exportSession.status); } }]; 

La desventaja de esta solución es que el file mientras que tenía que ser escrito en el disco. Sigo buscando una mejor manera de manejar files .m4a.