2011-11-07 15 views
6

Actualmente estoy programando una aplicación que extrae fotogramas de un clip de película. Lo diseñé para que la extracción se realice en un hilo separado para evitar que la aplicación se congele. El proceso de extracción en sí está tomando muchos recursos, pero funciona bien cuando se usa en el simulador. Sin embargo, hay problemas al construirlo para el iPad. Cuando realizo otra acción (le digo a mi reproductor AV que juegue mientras extraigo fotogramas), el hilo deja de funcionar inesperadamente, y creo que se está matando.El sistema operativo está eliminando el hilo

Supongo que es porque estoy usando muchos recursos, pero no del todo seguro.

Aquí están mis preguntas: 1. ¿Cómo puedo saber si/por qué mi hilo se detiene? 2. Si realmente se debe a un procesamiento excesivo, ¿qué debo hacer? Realmente necesito que esta acción se implemente.

Heres algunas im código utilizando: Para crear el hilo:

[NSThread detachNewThreadSelector:@selector(startReading) toTarget:self withObject:nil];

Voy a publicar cualquier información que necesite, Gracias tanto!

Actualización Estoy usando GCD ahora y rellena los hilos para mí. Sin embargo, el sistema operativo aún mata los hilos.

Sé exactamente cuándo está sucediendo. cuando le digo a mi [AVplayer play]; mata el hilo.

Este problema sólo ocurre en el iPad real y no en el simulador

+0

Si tiene que preguntar, intente utilizar una abstracción de nivel superior en su lugar, como las colas de envío (GCD) o las colas de operaciones (NSOperationQueue).Ver [El alejarse de los hilos] (http://developer.apple.com/library/mac/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/ConcurrencyandApplicationDesign/ConcurrencyandApplicationDesign.html#//apple_ref/doc/uid/TP40008091-CH100- SW8) para una discusión extendida, o busque un ejemplo [GCD] (http://stackoverflow.com/questions/7941860/#7941898) o [NSOperationQueue] (http://stackoverflow.com/questions/830218/). Es algo muy útil. – Jano

+1

¿se bloquea tu aplicación? en caso afirmativo, ¿qué dice el informe de fallos? ¿Estás seguro de que AVPlayer es seguro para los hilos? porque si estás llamando [AVplayer play] y accediendo a él al mismo tiempo en un hilo de fondo, ese podría ser el problema. – JeanLuc

+0

¿Está funcionando su hilo de extracción como hilo de fondo? Estoy aprendiendo Objective-C pero, si puede ejecutarlo como un hilo de fondo, puede ayudar a que el SO no lo mate. –

Respuesta

0

Cuando algo funciona en el simulador y no funciona en un dispositivo, una explicación obvia es un problema de restricción de recursos a ciencia cierta. Pero a veces el simulador no simula con precisión otros aspectos del funcionamiento del dispositivo. Entonces me pregunté si podría haber otra interpretación de la situación. Se me ocurrió una posibilidad de que podría ser una competencia por un acceso limitado al activo AV, lo que significa que cuando empiezas a jugar, ya no está disponible para ser procesado (y por alguna razón un error en el simulador). no muestra esta limitación)

En los estados AV Foundation Programming Guide, under "Playing Assets" Apple:.

Aunque en última instancia, que desea jugar un activo, no proporciona activos directamente a un objeto AVPlayer. En cambio, proporciona una instancia de AVPlayerItem. Un elemento de jugador administra el estado de presentación de un activo con el que está asociado. Un elemento de jugador contiene pistas de elementos de jugador (instancias de AVPlayerItemTrack) que corresponden a las pistas en el activo.

Esta abstracción significa que puede jugar un activo determinado usando diferentes jugadores simultáneamente, pero representados de diferentes maneras por cada jugador. Usando las pistas de elementos, puede, por ejemplo, desactivar una pista en particular durante la reproducción (es posible que no desee reproducir el componente de sonido).

Así que me pregunto: ¿está utilizando AVPlayerItems para acceder a sus activos, que permitiría que ambas operaciones se realizaran a la vez? Si es así, al menos esa dirección específica está descartada. Pero si no, podría valer la pena investigar para ver si soluciona el problema.

Podría agarrar pajas. Pero podría llevar a algún lado.

+0

Ahora sé de hecho que cuando leí fotogramas del activo después de iniciar un AVPlayer con este activo, el hilo se está deteniendo, pero ¿cómo puedo omitir eso? –

+0

Si no está accediendo al activo a través de un AVPlayerItem, debe proporcionar una instancia de AVPlayerItem para reproducir el activo, y una segunda instancia de AVPlayerItem para leer los marcos del activo. Esto debería permitir que ambos ocurran al mismo tiempo. –

+0

Estoy usando el recurso AVPlayer para reproducir el activo pero no para leer los cuadros. Para eso estoy usando AVAssetReader que se inicia con el activo en sí. ¿Cómo recomendarías hacer eso? –

0

En la sección 'Ajuste del tamaño de la pila de un hilo' de la Guía de programación Threading de Apple, página 27, dice:

En iOS y Mac OS X 10.5 y posteriores, asignar e inicializar un objeto NSThread (no utilice detachNewThreadSelector: toTarget: withObject: método)

a pesar de que en la página 22 dice detachNewThreadSelector es una de las formas de crear hilos utilizando NSThread.

Y da este ejemplo en la página 23 de cómo iniciar su hilo:

NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil]; 
[myThread start]; 

De acuerdo con la guía que va a crear un hilo separado en su aplicación. Intente crear su hilo de esta manera y vea si el sistema operativo deja de matar su hilo.

Como referencia aquí es el enlace a la guía

http://developer.apple.com/library/ios/iPad/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html#//apple_ref/doc/uid/10000057i-CH15-SW2

También se menciona en la página 29 que si su aplicación utiliza el modelo de memoria administrada, lo que parece que eres, la creación de una piscina autorelease en su hilo la rutina de entrada debe ser lo primero que hagas y, de forma similar, destruirla es lo último que hace tu hilo. No estoy seguro de no tener esto podría causar la muerte de su hilo, pero verifique que lo haga.

Tener un bloque try/catch en la rutina de entrada de subprocesos puede no resolver el problema de la muerte, pero evitará que la aplicación se cierre si se produce un error en la secuencia.

Olvidé mencionar esta otra sugerencia de diseño que puede ayudarlo con las limitaciones de recursos, como mencionó Duncan. De acuerdo con la página de la guía 18:

evitar estructuras de datos compartidos

La manera más simple y más fácil de evitar a hilos relacionados con los recursos conflictos es dar a cada hilo en el programa de su propia copia de todos los datos que se necesariamente. El código paralelo funciona mejor cuando minimiza la comunicación y la contención de recursos entre sus subprocesos.

Que, creo que puedes hacer eso en tu aplicación. Además de hacer lo que Duncan mencionó "no proporcione activos directamente a un objeto AVPlayer sino que proporcione una instancia de AVPlayerItem", hágalo creando instancias separadas para cada uno de sus hilos, una instancia de AVPlayerItem para el hilo del reproductor y una instancia de AVPlayerItem para el hilo de extracción.

1

Me parece que está intentando decodificar dos videoclips al mismo tiempo. Debido a la naturaleza de decodificación basada en hardware del iPad, solo puede admitir un proceso de decodificación a la vez. Cuando juegas un nuevo objeto, el antiguo se cancelará. Esto explicaría por qué funciona en el simulador, pero no en el dispositivo.

En cuanto a una solución, puede cambiar a un decodificador de software puro como libav (GPL) o CoreAVC SDK (comercial). De esta forma, no interferirá con el decodificador HW para la reproducción.

Cuestiones relacionadas