AVAssetReaderOutput copyNextSampleBuffer se bloquea al codificar video con audio en el dispositivo

Después de implementar la solución para codificar video (con audio) en esta pregunta, Video Coding usando AVAssetWriter – CRASHES , encontré que el código funciona correctamente en el iPhone Simulator. Lamentablemente, algunos videos no pueden codificar su audio mientras se ejecutan en un iPhone 5 real (y otros dispositivos).

Por ejemplo, los videos generados a partir del código de muestra WWDC 2011 RosyWriter ( https://developer.apple.com/library/IOS/samplecode/RosyWriter/Introduction/Intro.html ) no codifican completamente porque la function -[AVAssetReaderOutput copyNextSampleBuffer] nunca devoluciones.

Los búferes de video entran correctamente, pero tan pronto como intenta copyr el primer CMSampleBufferRef de audio, la llamada se cuelga. Cuando bash esto en videos que vienen de otras fonts, como los grabados en la aplicación de camera nativa iOS, el audio importa correctamente.

Este hilo, https://groups.google.com/forum/#!topic/coreaudio-api/F4cqCu99nUI , toma nota de la function copyNextSampleBuffer que cuelga cuando se usa con AudioQueues, y sugiere mantener las operaciones en un solo hilo. He intentado mantener todo en un hilo separado, en el hilo principal, pero no tuve suerte.

¿Alguien más experimentó esto y tuvo una posible solución?

EDITAR : Parece que los videos generados desde RosyWriter tienen sus pistas invertidas en relación con los videos de la aplicación de camera nativa, es decir, la transmisión de audio como transmisión 0 y la transmisión de video como transmisión 1.

 Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 60 kb/s Metadata: creation_time : 2013-10-28 16:13:05 handler_name : Core Media Data Handler Stream #0:1(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1920x1080, 8716 kb/s, 28.99 fps, 29.97 tbr, 600 tbn, 1200 tbc Metadata: rotate : 90 creation_time : 2013-10-28 16:13:05 handler_name : Core Media Data Handler 

No estoy seguro si esto hace una diferencia en AVAssetReader.

Todavía estaba experimentando este problema en iOS 9.3.2, y lo que resolvió fue asegurarse de que AVAssetReaderAudioMixOutput* se configuró inicialmente con opciones en lugar de nil al llamar -[AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks] .

Ejemplo:

 NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey, [NSNumber numberWithFloat:44100.0], AVSampleRateKey, [NSNumber numberWithInt:16], AVLinearPCMBitDepthKey, [NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved, [NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey, [NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey, nil]; // create an AVAssetReaderOutput for the audio tracks NSArray* audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; AVAssetReaderAudioMixOutput* _audioReaderOutput = [AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:audioTracks audioSettings:outputSettings]; 

Esto evitó que las llamadas posteriores a -[AVAssetReaderOutput copyNextSampleBuffer] cuando de lo contrario lo estaban haciendo.

Verifique el range de time en las pistas de audio usando algo como esto:

 NSLog(@"audioTrack timeRange: %lld, %lld", audioTrack.timeRange.start.value, audioTrack.timeRange.duration.value); 

Los ranges de time vacíos (0, 0) pueden hacer que hangNextSampleBuffer () se bloquee.

Este fue un error AVFoundation en iOS7. Ahora está arreglado en iOS8.

Este es un problema específico de hardware. Lo probé en el simulador, iPhone5 y iPhone 6. El problema ocurre al 100% con ciertos files de video, pero SOLAMENTE en el iPhone 5. No puedo hablar por el iPhone 5S. iOS8 NO soluciona este problema. La solución puede tener que limitar a los usuarios de iPhone 5 de ciertas funciones. Otro trabajo consiste en que el usuario select un video de su rollo de camera, forzando así la compression especial de Apple en él, y bautizando ese video en un formatting con el que el hardware del iPhone 5 puede funcionar.