Estoy trabajando en una aplicación para iPhone que pronto voy a mostrar a una audiencia en vivo.Ayuda de demostración de iPhone: ¿alguien sabe de una alternativa más rápida de captura de pantalla a UIGetScreenImage()?
Me gustaría demostrar la aplicación en vivo a través de VGA a un proyector, en lugar de mostrar capturas de pantalla.
Compré un adaptador VGA para iPhone, y he adaptado Rob Terrell's TVOutManager para satisfacer mis necesidades. Lamentablemente, la velocidad de cuadros después de las pruebas en mi televisor en casa no es tan buena, incluso en un iPhone 4 (quizás 4-5 cuadros por segundo, varía).
Creo que la razón de esta lentitud es que la rutina principal que estoy utilizando para capturar la pantalla del dispositivo (que luego se muestra en una pantalla externa) es UIGetScreenImage()
. Esta rutina, que ya no se permite como parte de las aplicaciones de envío, es bastante lenta. Aquí está el código que estoy usando para capturar la pantalla (FYI mirrorView
es una UIImageView
):
CGImageRef cgScreen = UIGetScreenImage();
self.mirrorView.image = [UIImage imageWithCGImage:cgScreen];
CGImageRelease(cgScreen);
¿Hay un método más rápido que puedo utilizar para capturar la pantalla del iPhone y lograr una mejor velocidad de cuadro (el rodaje de 20+ fps)? No es necesario pasar la revisión de la aplicación de Apple; este código de demostración no estará en la aplicación de envío. Si alguien sabe de alguna API privada más rápida, ¡realmente agradecería la ayuda!
Además, el código anterior se está ejecutando mediante una repetición de NSTimer
que dispara cada 1.0/desiredFrameRate
segundos (actualmente cada 0.1 segundos). Me pregunto si, en cambio, incluir esas llamadas en un bloque y usar GCD o un NSOperationQueue
podría ser más eficiente que tener el NSTimer
invocar mi método obj-c updateTVOut
que actualmente contiene esas llamadas. Agradeceríamos algo de información sobre eso también; algunas búsquedas parecen indicar que el envío de mensajes obj-c es algo lento en comparación con otras operaciones.
Por último, como se puede ver arriba, los CGImageRef
que UIGetScreenImage()
rendimientos se está convirtiendo en un UIImage
y después de que UIImage
se está pasando a una UIImageView
, que es probablemente cambiar el tamaño de la imagen sobre la marcha. Me pregunto si el cambio de tamaño podría ralentizar aún más las cosas. ¿Ideas de cómo hacer esto más rápido?
Hola Jonah, gracias por tu sugerencia. Resultó que intenté usar el método renderInContext: de CALayer. Es aún más lento. AVFoundation tampoco me va a ayudar en este caso, ya que no estoy capturando desde una cámara u otra fuente de AV. Estoy intentando capturar la pantalla en sí. Apple recomienda alternativas a UIGetScreenImage porque ya no lo permiten, pero este código no es para el envío de App Store, es solo para una demostración. –