AS3: Detener descarga del componente FLVPlayback
septiembre 4th, 2009Por alguna razón, Adobe no implementó un método para detener la descarga de un archivo FLV cuando queremos eliminar un componente FLVPlayback. Puedes crear un reproductor FLV dinámicamente y luego destruirlo, pero si ha comenzado la reproducción el fichero FLV continuará descargándose hasta que termine.
La clase FLVPlayback implementa el método closeVideoPlayer( índice ) que permite detener la descarga del archivo FLV que esté descargando, pero está limitado a cuando abres múltiples vídeos en un solo componente. La limitación consiste en no dejarte eliminar la conexión de video con la que creaste el reproductor.
// Creamos el reproductor y lo ponemos a reproducir var video:FlvPlayback = new FlvPlayback(); video.play( "video.flv" );
// Ahora intentamos cerrar el reproductor video.stop(); video.closeVideoPlayer(0); // Debería detener la descarga, pero nos lanza un error video = null; // Para que el Garbage Collector lo elimine de memoria
Si en el ejemplo omitimos video.closeVideoPlayer(0), el reproductor se elimina, pero el vídeo continúa descargándose y consumiendo ancho de banda.
Esto puede ser un problema cuando haces uso de varias instancias de este componente, y debido a las circunstancias no puedes usar uno solo. Cada una de ellas llamará a la descarga de un FLV, y puede darse el caso de estar descargando varios FLV a la vez, con el consiguiente consumo de ancho de banda.
La solución, acceder a la primera instancia VideoPlayer y detenerlo uno mismo:
// Ahora intentamos cerrar el reproductor video.stop(); video.getVideoPlayer(0).close(); // Ahora sí, detiene la descarga del archivo FLV video = null; // Para que el Garbage Collector lo elimine de memoria
Algo muy sencillo, pero que ya me ha hecho perder algo de tiempo buscándolo
. Aquí lo dejo como apunte.
Muchas gracias, funcionó muy bien.
Hola,gracias por este codigo,me dá mucho dolor de cabeza este problema.Pero una pregunta,
tengo una pelicula principal que carga varios swf.En el de video le puse un listener que se activa si ejecuto unload desde el swf madre con tu codigo,el problema es que lo hace perfecto la primera vez pero si vuelvo a la seccion video y repito el proceso salta error1009.Si no pongo video=null funciona.Porque?
Gracias y muy interesante tu web,la descubrí hace poco y me gusta
Hola Sergio. Me alegra un montón que te haya ayudado.
Respecto al problema que me planteas. Tendría que ver el código, pero por el código de error que te devuelve deduzco que intentas acceder a alguna propiedad de la instancia FlvPlayback ‘video’ después de ejecutar ‘video = null’.
‘video = null’ te destruye por completo dicha instancia de memoria. Tendrías que volver a crearlo con un ‘video = new FlvPlayback()’ para poder manejarlo de nuevo.
Prueba a ejecutar tu aplicación con el debugger (Ctrl+May+Enter en Flash), intenta reproducir el error y la ejecución se parará en la instrucción que intenta acceder al componente (y que en ese momento no existe). Se me ocurre que podrías comprobar si la instancia ‘video’ no es nulo/falso antes acceder a ella.
Espero haberte ayudado de nuevo.
Muchas gracias por tu informacion, ya se me estaba rompiendo la cabeza XD
Hola otra vez,un pequeño apunte por si alguien tiene mi mismo problema, si el reproductor esta en un swf que luego es cargado en la pelicula principal, para eliminarlo y no seguir escuchando el sonido por ejemplo de fondo :
en el swf del reproductor :
addEventListener(Event.REMOVED_FROM_STAGE, borrar);
function borrar(event:Event):void
{
this.flvplayback.stop();
this.flvplayback.getVideoPlayer(0).close();
this.flvplayback=null;
removeEventListener(Event.REMOVED_FROM_STAGE,borrar);
}
asi cuando se elimine del contenedor de la pelicula principal con removeChild el swf cargado escucha el evento y se elimina. Puede parecer una tonteria pero a mi me dió bastantes problemas .
Una duda, yo he puesto el reproductor de video dentro de un movieclip y este en la linea de tiempo principal, puedo usar el codigo que puso sergio (del swf externo) y el removeChild y donde? muchas gracias por la ayuda si llega.
saludos.
Entiendo que si. No habría problema en hacerlo. Sólo tienes que referenciarlo adecuadamente. Por ejemplo, desde root, siento la MC que contiene el reproductor “miReproductor” y esta siendo hija de root:
miReproductor.addEventListener(...alguien sabe como se podria elimimar la reproduccion de un flv que se efectua sin flvplayback, sino a traves de un reproductor que tira de una o varias clases para funcionar? he probado con el NetStream.close() que lo lei por la web pero da error.
gracias, de antemano……
saludos…
Mlo, Habría que ver las clases que lo componen por dentro. Y una vez localizado el componente, crear un método dentro de la clase que permita cerrar la descarga de datos.
¡GRACIAS! Estaba buscando cómo cerrar ese canal de reproducción en una web que tenía con varias secciones y reproducía varios videos en un mismo FLVPlayback, y no sabía que cuernos andaba mal. Tu solución funcionó perfectamente
, gracias por el dato.
te amo! =D