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.

Review: Product Development und UX bei Adobe

Flex Usergroup Berlin

Logo Flex UG Berlin

Solange ich noch einige Details der gestrigen Veranstaltung im Kopf habe, möchte ich gern eine kleine review erstellen.

Begonnen hatte die session um ca. 18:30 Uhr in der Zossener Strasse 55 in Berlin Kreuzberg. Veranstaltet wurde sie von der Flex Usergroup Berlin und dieses mal hat es mir wirklich gut gefallen. Die session war gut besucht und der Vortrag von Lars Wulfken(Experience Designer Adobe Systems) hatte bei vielen Zuhörern einiges an Interesse geweckt. Das machte sich durch häufige Detailfragen erkennbar. Gegen 21 Uhr endete der Vortrag und danach wurden noch einige detailiertere Fragen ausgetauscht.

Im groben war der Vortrag gegliedert in:

  • persönliche Vorstellung
  • was macht das XD Team in Hamburg
  • workflow und Planung
  • Zielgruppen
  • software development
  • interaction design
  • experience design
  • Einblick: adobe design patterns

Als zusätzliches Bonbon gab es noch einen kleinen Einblick in die neuen features von Device Central, dass mir bis dahin leider noch unbekannt war. Darunter war auch die Möglichkeit, in Zukunft mehr Aufmerksamkeit auf die Beschleunigungssensoren aktueller und kommender Handys bei der Anwendungsentwicklung zu legen. Diese Funktion hat bei mir sehr großes Interesse geweckt, auch mal mehr in die Handy-Richtung zu entwickeln.

Ich hoffe, die kommenden Termine der Flex UG Berlin werden gleichbleibend spannend.

Hier die originale Agenda des Termins.

weiterführende Links:

Aktualisierungproblem Flex Combobox

Auf pixeltex.com habe ich einen kleinen Artikel zum Problem der dynamischen Aktualisierung der Flex Combobox geschrieben. Seit einigen SDKs besteht das Problem darin, dass bei Änderung des Dataproviders die Dropdown-Liste nicht angepasst wird. Das kann dann störend sein, wenn zur Anwendungslaufzeit die Liste mehrfach angepasst wird.

zum Artikel:
Flex-Snippet: aktualisieren der Liste einer Combobox zur Laufzeit

Flex SDK 3.5 Updates

Im Zuge der Adobe Flex SDK 3.5 Veröffentlichung gab es nun einige Updates auf der Adobe Seite.

Das neue SDK mit aktualisierten data visualization components ist nun auch offiziell auf adobe.com zu finden.  Laut Adobe Blog wird es allerdings keine neue Flex Builder Version geben. Man soll auch weiterhin das Multi-SDK-Feature verwenden.

Unterstützt werden jetzt die mit Sicherheitsupdates ausgestatteten Flash Player 10.0.42 and AIR 1.5.3, inkl. einiger kleiner Bugfixes.

Die Language Reference wurde auch an die Version 3.5 angeglichen. Ich selbst habe auch noch mit der 3.4 Version gearbeitet.

weitere Informationen

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