Comunidad de diseño web y desarrollo en internet online

Problema no consigo sacar los metadatos.

Citar            
MensajeEscrito el 04 Abr 2014 11:46 am
Buenas gente antes de nada gracias a toda persona que me pueda ayudar.

Explico mi problema.

Estoy intentando crear un reproductor de vídeo completo, el vídeo lo cargo a través del NetStream y funciona bien.

El problema viene en que quiero sacar los metadatos de duración, y tamaño (ancho y alto) y no consigo pasarlos a ningún sitio de modo que yo luego pueda usarlos para hacer operaciones.

Mi código es el siguiente.


Código ActionScript :

package {
   
      //Importamos las clases necesarias.
      import flash.display.*;
      import flash.media.*;
      import flash.net.*;
      import flash.utils.*;
      import flash.events.*;
      import flash.display.*;
      import flash.media.Sound;
      //import CustomClient;
   
   public class reproductorVideo extends Sprite{
      
      //Datos para el video.
      
      private var UrlVideo:String;                           //Url del video
      private var nc:NetConnection;                           //Conexion con servidor.
      private var ns:NetStream;                              //Empieza el Streaming.
      private var video:Video;                              //Objeto video.
      private var AutoPlay:String;                           //Obtenemos el Play.
      private var Poster:String;                              //Ruta del poster.
      private var InsertPoster:URLRequest;                     //Objeto para la petición del poster.
      private var CargadorPoster:Loader;                        //Cargador del poster.
      
      //Dimensiones del reproductor
      
      private var ancho:int;                                 //Ancho del reproductor completo
      private var alto:int;                                 //Alto del reproductor completo
      
      //Metadatos del video.
      
      private var Vtmp:CustomClient;
      
      
      //Metodo constructor pinta el video y crea la conexión.
      public function reproductorVideo() {
         nc = new NetConnection();                           //Generamos la conexión
         nc.connect(null);                                 //Le decimos que el video esta alojado en un servidor externo que no es Flash Media Server.
         
         ns = new NetStream(nc);   
         Vtmp = new CustomClient();
         ns.client = Vtmp;
         
         ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR,NoError);    //Añadimos un evento para que ignore errores de syncronismo.
         
         video = new Video();                              //Creamos el objeto video.
         video.attachNetStream(ns);                           //Le asignamos el video en stream al objeto video.         
      }
      
      //Metodos para ingnorar errores.
      public function NoError(event:AsyncErrorEvent):void{
         //ignora errores.
      }
      
      //Metodos de obtención de datos.
      public function SetVideoDatas(video:String,Play:String,poster:String):void{   //Definimos las opciones de autoplay ruta del video y la del poster.
         this.UrlVideo = video;
         if(Play != ""){
            this.AutoPlay = Play;
         }else{
            this.AutoPlay = "False";
         }
         if(poster != ""){
            this.Poster = poster;
         }else{
            this.Poster = "False";
         }
         
      }
      
      //Metodos devolución de datos.
      public function InsertVideo(){                                    //retornamos la variable video.
         return video;
      }
      
      //Metodos internos.
      private function metaDatos(){
         //return Custom = new CustomClient();
      }
      
      //Metodos de diseño.
      public function InserPoster(){                                             //Insertamos el poster apartir de la URL definida.
         if(Poster != "False"){
            CargadorPoster = new Loader();
            InsertPoster = new URLRequest(Poster);
            CargadorPoster.load(InsertPoster);
         }
      }      
      
      public function SetDimensionesReproductor(anc:int,alt:int):void{                  //Definimos el ancho y alto del reproductor completo.
         this.ancho = anc;
         this.alto = alt;
      }
      
      //Metodos con funcionalidades.
      public function silenciar(event:MouseEvent){                              //Eliminamos el sonido del video por completo.
         var Sonido:SoundTransform = new SoundTransform(0.0);
         ns.soundTransform = Sonido;
      }
      
      public function sonido(event:MouseEvent){
         var Sonido:SoundTransform = new SoundTransform(1.0);                        //SoundTransform el primero numero es el volumen y el segundo el canal -1 izquierdo 1 derecho.
         ns.soundTransform = Sonido;
      }
      
      public function Play(event:MouseEvent){
         ns.resume();
      }
      
      public function Pause(event:MouseEvent){
         ns.pause();
      }
      
      //Control de reproduccion del video.
      public function Playing(){
         if(AutoPlay == "true"){
            ns.play(UrlVideo);
         }else{
            ns.play(UrlVideo);
            ns.pause();
         }            
      }

   }
}

class CustomClient{
   public var duration:Number;
   
   public function onMetaData(info:Object):void{
      this.duration = info.duration;
      trace("MetaDatos: Duracion = " + info.duration + " Ancho = " + info.width + " Alto = " +info.height);
   }
}



He tomado como referencia el tutorial que tenéis de como crear una barra de progreso puesto que sacan el dato de la duración.

Gracias a todos los que puedan ayudarme y si no es mucha molestia la persona que me responda podría explicar como lo haría el de forma un poco detallada para que yo consiga comprenderlo.

Muchas gracias y muy buen foro.

Por tecnoendika

15 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Abr 2014 11:54 am
Hace un tiempo que no hago video y estoy algo olvidado, pero onMetadata es un callback del NetStream que se invoca automáticamente en el cliente. Luego no hagas una clase aparte para poner el callback, ponlo en la misma clase.
Para que el callback vuelva a la misma clase usas

ns.client = this

Y luego declaras onMetaData dentro de la misma clase

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Abr 2014 12:12 pm
No acabo de entender tu respuesta debería poner

ns.client = this.onMetaData;

Por ejemplo o es de alguna otra manera.

Por tecnoendika

15 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Abr 2014 11:41 pm
Tu código deberia funcionar, pero igualmente:
...
ns = new NetStream(nc);
ns.client = this ;
...

// y en la misma clase (reproductorVideo) pone el método que tenés en CustomClient.

public function onMetaData(info:Object):void{
this.duration = info.duration;
trace("MetaDatos: Duracion = " + info.duration + " Ancho = " + info.width + " Alto = " +info.height);
}

Por rodrigolopezpeker

61 de clabLevel



 

chrome
Citar            
MensajeEscrito el 07 Abr 2014 09:17 am
como tu me comentas así funciona, pero el problema que tengo yo es que no se como usar esos datos puesto que si intento visualizarlo fuera de la función onMetaData me aparece NaN o 0, sin valores que yo pueda manipular.

gracias otra vez y siento ser tan pesado.

Por tecnoendika

15 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Abr 2014 02:07 pm

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

chrome
Citar            
MensajeEscrito el 07 Abr 2014 04:36 pm
Ya lo siento ser tan torpe y haceros perder el tiempo pero o soy ceporro o no consigo entenderlo.

Mi código completo es el siguiente si me podríais indicar en el como puedo implementar lo que me comentáis por la verdad no encuentro diferencias entre los códigos que encuentro y el mio.

Código ActionScript :

package viwom.reproductor{
   
      //Importamos las clases necesarias.
      import flash.display.*;
      import flash.media.*;
      import flash.net.*;
      import flash.utils.*;
      import flash.events.*;
      import flash.display.*;
      import flash.media.Sound;
   
   public class reproductorVideo{
      
      //Datos para el video.
      
      private var $__UrlVideo:String;                                             //Url del video
      private var $__nc:NetConnection;                                          //Conexion con servidor.
      private var $__ns:NetStream;                                             //Empieza el Streaming.
      private var $__video:Video;                                                //Objeto video.
      private var $__AutoPlay:String;                                             //Obtenemos el Play.
      private var $__Poster:String;                                             //Ruta del poster.
      private var $__InsertPoster:URLRequest;                                       //Objeto para la petición del poster.
      private var $__CargadorPoster:Loader;                                       //Cargador del poster.
      private var $__Sonido:SoundTransform;
      private var $__Contenedor:Sprite;
      
      //Metadatos del video.
      
      private var $__TmpClient:CustomClient;
      
      //Metodo constructor pinta el video y crea la conexión.
      public function reproductorVideo(){}
      
      //Función inicializadora.
      public function CreateVideo():void{
         $__nc = new NetConnection();                                          //Generamos la conexión
         $__nc.connect(null);                                                //Le decimos que el video esta alojado en un servidor externo que no es Flash Media Server.
         
         $__ns = new NetStream($__nc);   
         
         $__TmpClient = new CustomClient;
         $__ns.client = $__TmpClient;
         
                  
         //$__ns.addEventListener(Event.COMPLETE, DatosDelVideo);
         $__ns.addEventListener(NetStatusEvent.NET_STATUS, this.estadoReproduccion);   
         $__ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR,NoError);                   //Añadimos un evento para que ignore errores de syncronismo.
                  
         $__video = new Video();                                                //Creamos el objeto video.
         $__video.attachNetStream($__ns);
         $__Contenedor.addChild($__video);         
      }
      
      public function init():void{
         if($__AutoPlay != "TRUE")
         {
            $__CargadorPoster = new Loader();
            $__InsertPoster = new URLRequest($__Poster);
            $__CargadorPoster.load($__InsertPoster);
            $__Contenedor.addChild($__CargadorPoster);
         }
         
         if($__AutoPlay == "TRUE"){
            $__ns.play($__UrlVideo);
         }else{
            $__ns.play($__UrlVideo);
            $__ns.pause();
         }         
      }
      //Metodos para ingnorar errores.      
      public function NoError(event:AsyncErrorEvent):void{
         //ignora errores.
      }
      
      //Metodos de Inserción de datos.
      public function set VideoUrl(value:String){
         this.$__UrlVideo = value;
      }
      public function set ImageUrl(value:String){
         this.$__Poster = value;
      }
      public function set autoplay(value:String){
         this.$__AutoPlay = value;
      }      
      public function set contenedor(value:Sprite){
         this.$__Contenedor = value;
      }
               
      //Metodos internos.
      private function estadoReproduccion(event:NetStatusEvent):void{                     //Obtenemos el estado de video.
         switch(event.info.code){
            case "NetStream.Play.Start":
            //
            break;
            case "NetStream.Play.Stop":
            trace("Parado");
            break;
         }
      }
      
      
      //Metodos con funcionalidades.
      public function silenciar(event:MouseEvent):void{                              //Eliminamos el sonido del video por completo.
         $__Sonido = new SoundTransform(0.0);
         $__ns.soundTransform = $__Sonido;
      }
      
      public function sonido(event:MouseEvent):void{
         $__Sonido = new SoundTransform(1.0);                                    //SoundTransform el primero numero es el volumen y el segundo el canal -1 izquierdo 1 derecho.
         $__ns.soundTransform = $__Sonido;
      }
            
      //Control de reproduccion del video.
      public function Play(event:MouseEvent):void{
         $__ns.resume();
      }
      
      public function Pause(event:MouseEvent):void{
         $__ns.pause();
      }   
      
   }
}

class CustomClient{
   public var duracion:Number;
   public var ancho:Number;
   public var alto:Number;
   
   public function onMetaData(info:Object):void{
      this.duracion = info.duration;
      this.ancho = info.width;
      this.alto = info.height;
      
      trace("Esta es la duración del video = " + duracion);
      trace("Este es el ancho del video = " + ancho);
      trace("Esta es la altura del video = " + alto);      
   }
}


Gracias de ante mano y siento las molestias.

Por tecnoendika

15 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Abr 2014 06:13 pm
Jaja, costumbres de PHP [ $ ] o te gusta el dinero.
El problema, como dijo Jorge, es que onMetaData es asíncronico, por ende, deberías esperar a que se llame el callback para actualizar tu player (tamaño, scrub para el tiempo, etc).
En fin, si onMetaData nunca se llama, entonces tenes un problema con el video. Proba con otro.

Código ActionScript :

package viwom.reproductor{
   
      //Importamos las clases necesarias.
      import flash.display.*;
      import flash.media.*;
      import flash.net.*;
      import flash.utils.*;
      import flash.events.*;
      import flash.display.*;
      import flash.media.Sound;
   
   public class reproductorVideo{
      
      //Datos para el video.
      
      private var $__UrlVideo:String;                                             //Url del video
      private var $__nc:NetConnection;                                          //Conexion con servidor.
      private var $__ns:NetStream;                                             //Empieza el Streaming.
      private var $__video:Video;                                                //Objeto video.
      private var $__AutoPlay:String;                                             //Obtenemos el Play.
      private var $__Poster:String;                                             //Ruta del poster.
      private var $__InsertPoster:URLRequest;                                       //Objeto para la petición del poster.
      private var $__CargadorPoster:Loader;                                       //Cargador del poster.
      private var $__Sonido:SoundTransform;
      private var $__Contenedor:Sprite;
      
      //Metadatos del video.
      
      private var $__TmpClient:CustomClient;
      
      //Metodo constructor pinta el video y crea la conexión.
      public function reproductorVideo(){}
      
      //Función inicializadora.
      public function CreateVideo():void{
         $__nc = new NetConnection();                                          //Generamos la conexión
         $__nc.connect(null);                                                //Le decimos que el video esta alojado en un servidor externo que no es Flash Media Server.
         
         $__ns = new NetStream($__nc);   
         
// opcion 1
         $__ns.client = this ;

// opcion 2
         var cliente:Object = {};
         cliente.onMetaData = handlerMetaData ;
// puede ser que te tire errores por el resto de los callbacks disponibles. Depende del video.
// hay muchos callbacks opcionales disponibles (como onMetaData): onCuePoint, onImageData, onPlayStatus, onSeekPoint, onTextData, onXMPData

          $__ns.client = cliente ;

         //$__ns.addEventListener(Event.COMPLETE, DatosDelVideo);
         $__ns.addEventListener(NetStatusEvent.NET_STATUS, this.estadoReproduccion);   
         $__ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR,NoError);                   //Añadimos un evento para que ignore errores de syncronismo.
                  
         $__video = new Video();                                                //Creamos el objeto video.
         $__video.attachNetStream($__ns);
         $__Contenedor.addChild($__video);         
      }

// OPCION 2 (puede ser privado, ya que lo asignas como callback a la propiedad del objeto)
// misma implementation que OPCION1
private function handlerMetaData(p_info:Oject):void {} 

// OPCION 1 (callback directo, necesita ser publico para que NetStream tenga acceso)
public function onMetaData(p_info:Oject):void {
// duracion = p_info.duration
// ancho del video = p_info.width
// alto del video = p_info.height

// listar todas las propiedades de p_info:
for( var p:String in p_info) trace(p, '=', p_info[p]);

}
      
      public function init():void{
         if($__AutoPlay != "TRUE")
         {
            $__CargadorPoster = new Loader();
            $__InsertPoster = new URLRequest($__Poster);
            $__CargadorPoster.load($__InsertPoster);
            $__Contenedor.addChild($__CargadorPoster);
         }
         
         if($__AutoPlay == "TRUE"){
            $__ns.play($__UrlVideo);
         }else{
            $__ns.play($__UrlVideo);
            $__ns.pause();
         }         
      }
      //Metodos para ingnorar errores.      
      public function NoError(event:AsyncErrorEvent):void{
         //ignora errores.
      }
      
      //Metodos de Inserción de datos.
      public function set VideoUrl(value:String){
         this.$__UrlVideo = value;
      }
      public function set ImageUrl(value:String){
         this.$__Poster = value;
      }
      public function set autoplay(value:String){
         this.$__AutoPlay = value;
      }      
      public function set contenedor(value:Sprite){
         this.$__Contenedor = value;
      }
               
      //Metodos internos.
      private function estadoReproduccion(event:NetStatusEvent):void{                     //Obtenemos el estado de video.
         switch(event.info.code){
            case "NetStream.Play.Start":
            //
            break;
            case "NetStream.Play.Stop":
            trace("Parado");
            break;
         }
      }
      
      
      //Metodos con funcionalidades.
      public function silenciar(event:MouseEvent):void{                              //Eliminamos el sonido del video por completo.
         $__Sonido = new SoundTransform(0.0);
         $__ns.soundTransform = $__Sonido;
      }
      
      public function sonido(event:MouseEvent):void{
         $__Sonido = new SoundTransform(1.0);                                    //SoundTransform el primero numero es el volumen y el segundo el canal -1 izquierdo 1 derecho.
         $__ns.soundTransform = $__Sonido;
      }
            
      //Control de reproduccion del video.
      public function Play(event:MouseEvent):void{
         $__ns.resume();
      }
      
      public function Pause(event:MouseEvent):void{
         $__ns.pause();
      }   
      
   }
}

Por rodrigolopezpeker

61 de clabLevel



 

chrome
Citar            
MensajeEscrito el 07 Abr 2014 07:59 pm
Oye muchas gracias a los dos me estais ayudando mucho. :D

El simbolo $ si me viene de PHP que estoy más acostumbrado.

Por tecnoendika

15 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Abr 2014 07:20 am
Perdona que vuelva con el tema resultare ya bobo.

Dentro de la función cuando aplico las opciones que me das me salen los datos.

videoframerate = 24
aacaot = 2
videocodecid = avc1
tags =
avcprofile = 66
audiochannels = 2
audiosamplerate = 44100
avclevel = 20
height = 434
duration = 34.87637188208617
audiocodecid = mp4a
width = 1024
moovposition = 36
seekpoints = [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
trackinfo = [object Object],[object Object]





Ahora lo que no se hacer es poder usar esta información que me da en otra función totalmente distinta, necesito sacar el ancho y el alto del vídeo así como su duración.

Necesito usarlos en otra función distinta que devuelva datos al programa principal y esta parte es la que no se hacer.

Cuando intento asignar alguno de estos valores a una variable fuera de la función que recibe el callback esta se encuentra vacía o me aparece NaN.

Yo asigno el valor de la siguiente forma.

this.$__duracion = p_info.duration;

y si intento acceder por fuera de la función heandlerMetaData a la propiedad $__duracion aparece vacía.

Gracias otra vez por vuestra paciencia.

Por tecnoendika

15 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Abr 2014 02:01 pm
Creo que Jorge tiene mas paciencia para responder esto,
2 opciones

1 $duracion tiene que ser public
2 como te hemos comentado, onMetaData es asincronico, eso significa que no se ejecuta al momento que le das play() al NetStream, sino que necesita escuchar un evento o un callback porque son ejecuciones de cosigo tardias, como cuando cargas una imagen y tenes q esperar al evento on complete.
Entonces, lo que deberias hacer es:
En la funcion onmetaData dispara un evento que le notifique a esta funcion o programa externo q dijiste del ancho y alto del video

Por rodrigolopezpeker

61 de clabLevel



 

safari
Citar            
MensajeEscrito el 09 Abr 2014 09:55 am
Muchisimas Gracias yo lo he comprendido y está solucionado muchas gracias.

Por tecnoendika

15 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.