Newsletter Registrierung

Name
E-Mail*

Die mit einem * gekennzeichneten Felder müssen ausgefüllt werden!



Metadatenworkflow für Postproduktion und Online Video – Teil 2 Drucken E-Mail
Geschrieben von: Sven Brencher   
Freitag, 24. Oktober 2008 um 12:16

Nachdem wir im ersten Teil gesehen haben, wie man die Metadaten in der Postproduktion hinzufügen kann, geht es jetzt darum einen Flash Prototypen zu bauen, der die Metadaten tatsächlich auch wieder anzeigen kann. Die Informationen aus der Spracherkennung kann man z.B. zum Durchsuchen des Online Clips verwenden. Neben der Suche kann aber auch gleich die entsprechende Stelle im Clip angesprungen werden. Der Vorteil dieser Metadaten liegt darin, dass der Zuschauer nicht erst den gesamten Clip ansehen muss, um zum entsprechenden Inhalt zu gelangen und außerdem können Suchmaschinen den Clip wesentlich besser zuordnen. 

Leider durchsucht Google die XMP Metadaten des Clips derzeit noch nicht, aber für die Zukunft wird dort sicher einiges passieren. Insbesondere, wenn man sich mal den eigenen Audioindizierungsdienst von Google ansieht.

Achtung: Dieses Tutorial funktioniert nur mit Flash CS4 und dem Flashplayer 10! Zur Erstellung des Tutorials lag mir auch noch keine Dokumentation vor, sodass mir nichts anderes übrig blieb, als die Metadaten Funktionen des Flashplayer 10 selbst auszuprobieren. Warten wir also mal ab, was die finale Version dann an Änderungen bringt.

Erstellen eines Prototypen zur Ausgabe der Metadaten

Die Anwendung besteht aus zwei Teilen. Einer Benutzeroberfläche bestehend aus drei Komponenten und dem ActionScript Teil, der die Videoinformationen ausliest. Ich habe diese Anwendung erstellt, um erst mal auszuprobieren, ob es überhaupt möglich ist die XMP Daten aus der Spracherkennung auszulesen und an eine entsprechende Stelle im Clip zu navigieren. Diesen Prototypen kann man sicherlich noch erweitern. Aber erstellen Sie zunächst in Flash CS4 ein neues Dokument für ActionScript 3.0 und Flashplayer 10. Die Flash Datei sollte im gleichen Verzeichnis liegen, wie der F4V Film aus dem vorangegangen Workshop. Der Bühne fügen Sie danach 3 Komponenten hinzu:

  • eine TextArea Komponente mit dem Instanznamen "wordListText"
  • eine TextInput Komponente mit dem Instanznamen "searchBox"
  • und eine Schaltflächen Komponente mit dem Instanznamen "seekBtn" 
Danach öffnen Sie den ActionScript Editor und importieren folgende Packages:
 
import flash.display.*;
import flash.net.*;
import flash.media.*;
import flash.system.*;
import flash.events.*;
 
Video importieren 
Als erstes erstellen wir eine neue NetConnection, ein NetStream Objekt und ein Video Objekt, das die F4V Datei "metadate.f4v" lädt und fügen es der Stage hinzu:
var my_nc:NetConnection = new NetConnection();
my_nc.connect(null);
var my_ns:NetStream = new NetStream(my_nc);
my_ns.play("metadata.f4v");
my_ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, errorHandler);
function errorHandler(event:AsyncErrorEvent):void{
}
var my_video:Video = new Video();
my_video.attachNetStream(my_ns);
addChild(my_video);

Auf der Bühne sollte jetzt links oben schon mal das Video dargestellt werden. Als nächstes erstellen wir einen Metadaten Client für das NetStream Objekt und rufen die Funktion onXMPDataHandler auf, wenn in dem Clip Metadaten gefunden und an das Metadaten Client Objekt übergeben werden. Die Funktion selbst schreiben wir später (also die Anwendung noch nicht testen):

var metadataClient:Object = new Object();

my_ns.client = metadataClient;

metadataClient.onXMPData = onXMPDataHandler;

 

Variablen deklarieren 

Für die verschiedenen Funktionen wird eine Reihe von Objekten verwendet, die wir als nächstes erstellen:

  • metadataXML und metadataValues sind XML Objekte, in denen die XMP Informationen gespeichert werden sollen
  • rdf und xmpDM sind die Namespaces aus den XMP Metadaten des F4V Clips
  • wordListLengt speichert die Anzahl der gefundenen Wörter aus der Spracherkennung
  • wordArray und currentWordTimecode sind Arrays in das die Wörter aus der Spracherkennung mit dem zugehörigen Timecode gespeichert werden
  • currentWord und currentTimecode werden benötigt, um die XML Daten in das Array zu speichern
  • wordArrayComplete ist ein Ereignis, dass wir später auslösen, wenn alle XMP Metadaten ausgelesen sind, damit der Anwender die Suche starten kann
  • Die Konstante tcOffset habe ich errechnet, um den seltsamen XMP Timecodewert in Millisekunden zu umzurechnen. Bei meinen Tests kam der Wert ungefähr hin, aber ich konnte nicht herausfinden, was genau für ein Wert von den Adobe Anwendungen gespeichert wird.
var metadataXML:XML;
var metadataValues:XML;
var wordListLength:Number;
var rdf:Namespace = new Namespace("http://www.w3.org/1999/02/22-rdf-syntax-ns#");
var xmpDM:Namespace = new Namespace("http://ns.adobe.com/xmp/1.0/DynamicMedia/");
var wordArray:Array = new Array();
var currentWord:String;
var currentTimecode:Number;
var currentWordTimecode:Array;
var wordArrayComplete:Event = new Event("wordArrayComplete");
const tcOffset:Number = 255147334405;
 
Ereignislistener hinzufügen
Der Anwendung werden zwei Ereignislistener hinzugefügt. Der eine startet die Funktion initSpeechSearch, wenn das Ereignis wordArrayComplete ausgegeben wurde, also wenn alle Metadaten eingelesen sind und an das Array übergeben sind. Der andere ruft die Funktion seekForWord auf, die nach einem Wort in dem Metadaten Array sucht und den Film an die entsprechende Stelle spielt:
 
addEventListener("wordArrayComplete", initSpeechSearch);
seekBtn.addEventListener(MouseEvent.CLICK, seekForWord);
 
Metadaten auslesen und das wordArrayComplete Ereignis auslösen, wenn alles geladen wurde

Wenn der Film Metadaten an den Metadaten Client übergibt, dann wird die Funktion onXMPDataHandler aufgerufen und die Metadaten werden der Funktion als Objekt übergeben. Ich erstelle danach ein neues XML Objekt und lese die Daten aus dem übergebenen Objekt aus der data Eigenschaft aus. In der Variablen wordListLength speichere ich die Anzahl der übergebenen Wörter. Um an die entsprechenden XML Informationen zu kommen ist es sinnvoll das XML Objekt auszugeben und dann mit E4X zu dem entsprechenden XML Knoten navigieren. Die for Schleife liest die einzelnen XML Knoten der Spracherkennung aus und fügt die Wörter und Timecode Infos an das Array wordArray an. Am Ende wird das Ereignis wordArrayComplete ausgegeben.

function onXMPDataHandler(XMPData:Object):void {
  metadataXML = new XML(XMPData.data);
  //trace (metadataXML..rdf::li[0]);
  wordListLength = metadataXML..rdf::li[0]..rdf::li.length();
  for (var i=0; i<=wordListLength; i++) {
    currentWord = metadataXML..@xmpDM::name[i];
    currentTimecode = Number(metadataXML..@xmpDM::startTime[i]/tcOffset);
    currentWordTimecode = new Array(currentWord, Math.floor(currentTimecode));
    wordArray.push(currentWordTimecode);  
  }
  dispatchEvent(wordArrayComplete);

 
Ausgeben der Wörterliste in das Textfeld
Die gefundenen Wörter, werden über eine for-Schleife der Textfeldkomponente hinzugefügt. Dabei wird mit der if-Abfrage überprüft, ob das Wort gerade eben schon hinzugefügt wurde, denn die Adobe Programme speichern für jede Spur die Informationen ab. In einem Stereoclip kommt dann jedes Wort zweimal hintereinander vor. 
 
function initSpeechSearch(event:Event):void {
  wordListTxt.text = "";
  for (var i=0; i<=wordListLength; i++){
    if (i>0 && wordArray[i][0] != wordArray[i-1][0]) {
      wordListTxt.appendText(wordArray[i-1][0] + " ");
    }
  }
 
Nach Wörtern suchen

Die Funktion seekForWord schaut ob, das eingegebene Wort im Array vorkommt und spult den NetStream bei einem Treffer an die entsprechende Timecode Stelle. Eine finale Anwendung würde dem Anwender sicher erst mal eine Trefferliste präsentieren und ihn dann auswählen lassen wohin er im Clip springen möchte. Dieser Prototyp wird den Clip immer zur letzten Fundstelle springen lassen. There is still space for improvement!

function seekForWord(event:MouseEvent):void {
  var searchWord:String = searchBox.text;
  var timecode:Number = 0;
  for (var i=0; i<=wordListLength; i++) {
    if ( searchWord == wordArray[i][0] ) {
      timecode = wordArray[i][1];
    }
  }
  my_ns.seek(timecode);

Die Anwendung hat bisher mit F4V Clips funktioniert, versagte aber bei FLV Clips noch ihren Dienst. Bisher hatte ich in der Vorbereitungszeit zur CS4 Tour, wo ich diese Anwendung zeigen wollte noch keine Zeit die Anwendung zu verbessern und die Fehler auszubügeln. Für gute Ideen, was man noch so aus den XMP Metadaten, die im Clip gespeichert sind rausholen kann, bin ich jederzeit offen!

Kommentare (0)add comment

Kommentar schreiben

busy