Christian Mueller

Flex Videodisplay und direkte Zeitmarken

Ich habe momentan das Problem, dass ich bei der Videodisplay-Komponente nicht direkt an eine bestimmte Stelle springen kann. Dieses Problem lässt sich momentan leider nicht umgehen, da man an der Methode seek() nichts anpassen kann. Aus diesem Grund habe ich begonnen einen kleinen workaround zu erstellen. Dazu auch nochmal vielen Dank für den Tipp beim Flex UG event, zu den keyframes innerhalb des Videos, die bei H.264 nochmal anders gesetzt werden.

Der workaround sieht so aus, dass das Video erst dann wieder eingeblendet wird, wenn die Zeitmarke erreicht ist. Das Videodisplay springt automatisch, durch die seek Methode einen kleinen Schritt zurück und das mache ich mir zu nutze. Beim setzten der playheadtime und anschließendem play(), wird ein bitmap erzeugt und über das Video gelegt. Ebenso wird die Lautstärke auf 0 gesetzt. Wird die Zeitmarke wieder erreicht, wird das bitmap entfernt und die Lautstärke zurückgesetzt. Bis zu diesem Punkt wird auch die update-Methode unterbrochen.

/**
 * @author Christian Müller
 * @date 16.01.2010
 * @url http://www.christian-mueller-design.de
 */
package de.cmd.videodisplay {
  import flash.display.Bitmap;
  import flash.display.BitmapData;
  import flash.display.PixelSnapping;
  import flash.display.Sprite;

  import mx.controls.VideoDisplay;
  import mx.events.VideoEvent;

  public class AccurateVideoDisplay extends VideoDisplay {

    private var _targetPositionSet  : Boolean; // if new position set from outside
    private var _targetPlayHeadTime : Number;  // playheadtime video has to reach
    private var _targetVolume       : Number;  // video volume on new playheadtime

    private var _overlayImage       : Sprite;  // sprite containing screenshot of video while loading

    public function AccurateVideoDisplay() {
      super();
      _targetPositionSet     = false;
      playheadUpdateInterval = 50;
      addEventListener( VideoEvent.PLAYHEAD_UPDATE, onPlayHeadUpdateTrigger ); // overwrite event
    }

    override public function get playheadTime():Number {
      return super.playheadTime;
    }

    override public function set playheadTime( value:Number ):void {
      // set target values
      _targetPositionSet  = true;
      _targetPlayHeadTime = value;
      _targetVolume       = this.volume;

      // set new playheadtime
      super.playheadTime  = value;

      // create and add screenshot
      displayWaitingImage();
    }

    override public function play():void {
      super.play();
    }

    // called when playheadtime changes
    private function onPlayHeadUpdateTrigger( event:VideoEvent ):void {

      // playhead update event will not be dispatched until targetplayheadtime reached
      // outside nothing will happen until targettime
      if ( _targetPositionSet ) {
        event.stopImmediatePropagation();
      }

      // check if target playheadtime reached
      if ( playheadTime >= _targetPlayHeadTime ) { // success
      // screenshot existing
        if ( _overlayImage != null ) {
        var index : Number = getChildIndex( _overlayImage );
          if ( index > -1 ) {
          // remove screenshot and recreate old state
          removeChildAt( index );
          _overlayImage      = null;
          volume             = _targetVolume;
          _targetPositionSet = false;
          }
        }
      }
    }

    // create screenshot of current videoposition
    private function displayWaitingImage():void {
      // set remove sound and add screenshot
      volume = 0;

      var screenshot : BitmapData = new BitmapData( this.width, this.height );
      screenshot.draw( this );
      var overlayImageBmp : Bitmap = new Bitmap( screenshot, PixelSnapping.AUTO, true );
      _overlayImage = new Sprite();
      _overlayImage.addChild( overlayImageBmp );
      addChild( _overlayImage );
    }
  }
}

Der Entwicklungsstand ist ehr als Alpha zu bezeichnen, da nur Standardoperationen verwendet werden. Allerdings dient sie schonmal als gute Basis.

Ich würde mich auch über andere Ratschläge oder Weiterentwicklungen freuen.

Firefox 3.5 released

Seit vorgestern gibt es offizell die Version 3.5 als Update. Man muss es allerdings selbst anstoßen. Es fehlen noch einige Add-ons, aber die werden wahrscheinlich recht schnell nachgeliefert.

Meine noch nicht aktualisierten Add-ons:

  • Google Notebook
  • Poster
  • Temporary Inbox

Das sind so ca. 15% meiner genutzten Tools, somit hält sich das Ganze in Grenzen.

Was sich wirklich bemerkbar macht, ist der Geschwindigkeitsvorteil. Ich habe den Browser auf großen Portalseiten, wie gmx oder t-online ohne Addblock getestet und man merkt es doch enorm. Ein weiteres cooles feature ist die neue eingebettete Videofunktion mit den neuen Tags. Testen kann man das schon auf der Firefox-Update-Seite.

wichtigste neue Funktionen:

  • Geschwindigkeitsoptimierung
  • “private browsing”-Funktion
  • Audio und Video als embed
  • Positionsbestimmung über google maps und GPS
  • ladbare Schriften
  • überarbeitete Cachfunktion für offline browsing
  • Multicore-Unterstützung

ZDNet hat sich auch schon ausgiebig mit dem neuen Performance-Feature auseinander gesetzt. Was die Performace angeht, muss der Firefox leider noch hinter Chrome und Safari zurückstecken, gewinnt gegen den IE allerdings mit Längen. An der Version 3.6 wird ja auch schon gebastelt und die soll nochmal einen Geschwindigkeitsgewinn bringen. Erste Tests mit der Version 3.6a geistern schon im Netz herum.

ZDNet Artikel mit Benchmarks

What’s new:
httpv://www.youtube.com/watch?v=k5Zbc-Rg6e8

weitere Testartikel:

Twitter

  • Quatsch Comedy Club -
    http://t.co/zp15KjYs
    2012/02/04 00:27
  • Admiralspalast im Winter -
    http://t.co/fxafCyb8
    2012/02/04 00:55
  • Wow, did not know that #cycling in #britain is so dangerous
    http://t.co/Ug6EvIY2
    2012/01/30 18:27
  • wow RT @FITC: Using a data visualization of the children's brain waves @B__REEL created upholstery for a unique chair
    http://t.co/ohZEYpTy
    2012/01/30 17:04
  • Ha, ok. It was the fault of the #MWSearch extension. Nice to know
    2012/01/30 09:14