Actualizar el sonido de un vídeo en AS3

Estoy viendo algo bastante raro. Según la documentación el objeto NetStream necesita un objecto SoundTransform para modificar el sonido. Benne.

Pero resulta que para que cambie el volumen (supongo que para las otras propiedades también) hay que “reasignar” el objeto SoundTransform de nuevo… Algo así:

—————————————————————————
var st:SoundTransform = new SoundTransform(1,0);

var ns:NetStream = new NetStream();
ns.soundTransform = ts;

(en otra función)

st.volume = 0.5;
ns.soundTransform = ts; // sin esta linea el volumen no se actualiza
—————————————————————————

Lo podéis ver funcionando en ZVideo (un wrapper en AS3 para simplificar el uso de vídeo) y también lo he encontrado en un player libre de vídeo de SourceForge: AS3 FLV Player.

¿Estoy empanao o esto funciona realmente así y simplemente llego tarde? No entiendo por qué si el objeto NetStream tiene una referencia al SoundStream hay que volver a asignársela para que surtan efectos los cambios.

Educa al friki

7 Responses to “Actualizar el sonido de un vídeo en AS3”

  1. Cay Says:

    Sip, segun entiendo hay q volverla a asignar para que rule… es lo mismo que el ColorTransform de un DisplayObject…
    var ct=mc.transform.colorTransform;
    ct.color=0xFF0000;
    mc.transform.colorTransform=ct;
    y si, yo tambien lo veo bastante tonto ^^

  2. Hector Says:

    No es tonto en absoluto.

    Para unificar propiedades comunes de objetos a veces se crean clases (como en este caso), y el objeto principal tiene que leer cada propiedad de las clases para su configuración o ejecución. Sin embargo no es posible saber cuándo se ha cambiado una propiedad de la clase y actualizar en consecuencia el objeto, a menos que se lance algún evento o algo similar, y en muchas ocasiones es menos costoso hacer esto otro.

    Espero haberme explicado bien con este mensaje escrito rápidamente. Por cierto, esto ya se veía también en AS1 y 2, por ejemplo con las clases TextFormat de los campos de texto.

  3. Zárate Says:

    Ummm… no estoy de acuerdo :)

    SoundTransform podría extender de EventDispatcher y avisar a sus listeners de que alguna de sus propiedades ha cambiado. Como poco lo veo poco intuitivo. Yo esperaría poder hacer algo como esto:

    netstream.soundTransform.volume = xx;

    Y que funcionara sin problemas. La propiedad soundTransform del netstream podría usar getter/setters para que si se intenta acceder a ella cuando aun no se ha creado, se cree automáticamente. Es más, podría estar creada por defecto ya que es muy raro que alguien ponga un vídeo sin sonido.

    Seguramente no lo hacen por temas de rendimiento, lo cual es discutible. Lo que es inexcusable es que la documentación no diga nada.

    Salud!

  4. Hector Says:

    Hombre, aunque mi mensaje anterior no sea una proeza de la literatura creo que se ve que he dicho que se podrían lanzar eventos para algo así… se podría usar un sistema algo similar al usado por Java, lanzar eventos genéricos en plan “PropertyChanged” con un string especificando la propiedad cambiada en cuestión y actuar en correspondencia. El problema del sistema de eventos de AS3 es que es más lento y costoso que el ASBroadcaster o el EventDispatcher de AS2.

  5. Zárate Says:

    Ummm… estoy de acuerdo :)

    Nah, tienes razón que lo habías comentado, pero en una primera lectura me pareció que lo justificabas de alguna forma cuando en cualquier caso me parece mal por parte de Adobe.

    O porque el sistema de eventos es más lento y cosotoso de lo que debería. O porque no lo han documentado.

    Salud!

  6. Hector Says:

    Bueno, no entro en que Adobe lo haya hecho mal o bien con mis mensajes, simplemente explicaba el porqué de esto, al menos desde mi punto de vista (y seguramente más de un programador por ahí dirá que lanzar eventos en una clase únicamente encapsuladora de propiedades es algún tipo de herejía)… de hecho esto se ve también en bastantes sitios de .NET.

    Personalmente con la clase SoundTransform no he trabajado mucho, pero ya las primeras veces que lo hice no tuve problema alguno, supongo que como ya me había fijado en que esto era así en más casos no lo dí importancia. Quién sabe si este detalle no esté perdido por ahí en algún lugar de la documentación… hay gente a la que la documentación de AS3 le encanta, a mí me gustaba más la de AS1 & 2.

  7. Cay Says:

    uy, me habia perdido estos comments ^^
    Personalmente, siempre que algo se hace mas dificil/complejo/engorroso sin necesidad ni argumentos de peso me parece un error… y el argumento de que utiliza mas recursos me parece que en estos casos no se justifica, ya que dificilmente una app va a cambiar mas de una vez por frame el pan, volumen, etc. de un sonido (o el color, etc. de un DO).
    Por cierto, la doc de flash, en DisplayObject.transform dice esto:
    Each of the transform object’s properties is itself an object. This concept is important because the only way to set new values for the matrix or colorTransform objects is to create a new object and copy that object into the transform.matrix or transform.colorTransform property.
    Saluti

Leave a Reply