iOS Vid, eo: ¿son posibles más de 4 AVAssetReaders simultáneos?
Me gustaría renderizar múltiples videos H264 mp4 en múltiples vistas al mismo tiempo. El objetivo es leer alrededor de 8 videos cortos, cada uno con un tamaño de 100x100 píxeles y permitirles mostrar su contenido en múltiples posiciones en la pantalla, simultáneamente.
Imagine 24 cuadros en la pantalla, cada uno mostrando un video del grupo de 8 videos.
MoviePlayer no funciona, ya que solo muestra un video a pantalla completa. Un AVPlayer con múltiples AVPlayerLayers es limitado, porque solo La capa creada más recientemente mostrará su contenido en la pantalla (de acuerdo con la documentación y mis pruebas).
Entonces, escribí una breve clase de video y creé una instancia para cada archivo .mp4 en mi paquete, usando AVAssetReader para leer su contenido. En la actualización, cada videograma se recupera, se convierte en un UIImage y se muestra, de acuerdo con la velocidad de fotogramas del video. Además, estas imágenes se almacenan en caché para un acceso rápido en bucle.
- (id) initWithAsset:(AVURLAsset*)asset withTrack:(AVAssetTrack*)track
{
self = [super init];
if (self)
{
NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA], (NSString*)kCVPixelBufferPixelFormatTypeKey, nil];
mOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:track outputSettings:settings];
mReader = [[AVAssetReader alloc] initWithAsset:asset error:nil];
[mReader addOutput:mOutput];
BOOL status = [mReader startReading];
}
return self;
}
- (void) update:(double)elapsed
{
CMSampleBufferRef buffer = [mOutput copyNextSampleBuffer];
if (buffer)
{
UIImage* image = [self imageFromSampleBuffer:sampleBuffer];
}
[...]
}
En realidad, esto funciona bastante bien, pero solo para 4 videos. El quinto nunca aparece. Primero pensé en problemas de memoria, pero lo probé en los siguientes dispositivos:
iphone 3gIphone iPadIpaduve el mismo comportamiento en cada dispositivo: 4 videos reproduciéndose en un bucle suave, sin diferencias.
Si hubiera sido un problema de memoria, habría esperado que al menos el iPad 2 mostrara 5 o 6 videos (debido a su mejor hardware) o que el 3GS mostrara solo 1 o un bloqueo en alguna parte.
Sin embargo, el simulador muestra todos los videos.
Debugging en el dispositivo muestra que
BOOL status = [mReader startReading];
devuelve falso para el video 5,6,7 y 8.
Entonces, ¿hay algún tipo de configuración de hardware (o restricción) que no permita más de 4 AVAssetReaders simultáneos? Porque, realmente no puedo explicar este comportamiento. No creo que todos los dispositivos tengan exactamente la misma cantidad de memoria de video.