ritschmanhard: flash swf/flv filter

Hi Leute!

Ich bin noch relativ neu in der Materie, deshalb sind meine Fragen vielleicht etwas naiv oder trivial.

Aber zum Thema:
Ich habe eine FLV Datei erzeugt, die ich mittels eines eingebundenen SWF Players in einer HTML Seite wiedergebe. Soweit so klar.

Verwende ich nun sehr hohe Kompressionsraten bei der Erzeugung der FLV Datei, so wird das Ergebnis (neben kleineren, nicht störenden Artefakten) ziemlich unscharf.
Nun ist es so, dass ich gerade den (im FLV) enthaltenen Text gerne schärfer hätte.
Ich habe festgestellt, dass wenn ich mittels eines üblichen Grafikprogramms (z.B. Irfanview) nachträglich einen Screenshot "schärfe", das Ergebnis wesentlich besser zu lesen ist.

Nun stellt sich mir die Frage, ob es nicht mittels des/eines SWF Players möglich sein könnte, das gezeigte FLV Bild clientseitig während des Abspielens "nachzuschärfen".
Leider konnte ich bei diversen SWF Playern keine Option/Schnittstelle finden, mittels derer ich einen entsprechenden Filter hätte andocken können.

Und genau das ist nun die Frage:

  1. gibt es einen SWF Player, der sowas nativ kann?
  2. wenn nicht: gibt es eine entsprechende add Filter Schnittstelle bei einem bekannten SWF Player?
  3. wenn nicht: Könnte man sowas mit einem eigenen SWF Player erreichen?
  4. wenn ja: was benötige ich, um einen SWF Player zu erstellen - hat das was mit ming und Action Script zu tun?
  5. wenn nein: siehe 6
  6. danke für das Lesen dieses langen Posts.

Grüße,
Richard

P.S.: ein Runterfahren der Kompression des FLV würde zwar auch mein Problem lösen, stellt aber nur eine Notlösung dar, da die Datei dann wieder grösser wird...

  1. Heyhoh.

    Ich bin noch relativ neu in der Materie, deshalb sind meine Fragen vielleicht etwas naiv oder trivial.

    Finde ich nicht, gerade wenn die Materie neu für Dich ist :-)

    Verwende ich nun sehr hohe Kompressionsraten bei der Erzeugung der FLV Datei, so wird das Ergebnis (neben kleineren, nicht störenden Artefakten) ziemlich unscharf.
    Nun ist es so, dass ich gerade den (im FLV) enthaltenen Text gerne schärfer hätte.

    Also... Der zur Erstellung der FLVs vermutlich verwendete Sorensen Spark Codec ist nicht gerade auf der Höhe der Zeit. ON2 VP6 liefert hier deutlich bessere Ergebnisse bei geringerer Dateigrösse. Der Einsatz scheint allerdings Lizenzfragen aufzuwerfen... und:

    Noch besser wird es mit Flash 9, respektive H.264. Hier sollten sich dann eigentlich auch freie Lösung zur Kodierung finden lassen, kurzes Googlen brachte folgendes:
    http://www.video-flash.de/index/open-source-mpeg-4-flashvideo-encoding-mit-ffmpegx-x264-aac/

    Mit beiden Alternativen habe ich bislang allerdings noch nicht gearbeitet, aber vielleicht hilft es Dir ja.

    Ich habe festgestellt, dass wenn ich mittels eines üblichen Grafikprogramms (z.B. Irfanview) nachträglich einen Screenshot "schärfe", das Ergebnis wesentlich besser zu lesen ist.
    Nun stellt sich mir die Frage, ob es nicht mittels des/eines SWF Players möglich sein könnte, das gezeigte FLV Bild clientseitig während des Abspielens "nachzuschärfen".

    Interessante Idee ;-) Seit Flash 8 gibt es einen Pool an Filtern, z.B. ein Weichzeichner ist dabei. AFAIK aber kein Scharfzeichner.
    Wenn es diesen denn geben sollte, müsste man aber vermutlich mit merklichen Performance Einbußen rechnen.

    Um SWFs zu erstellen, gibt es viele Möglichkeiten. Freie wie z.B. OpenLaszlo, Flex... Oder eben auch die kostenpflichtige Hauslösung von Adobe.
    Ausgehend von Deiner eigentlichen Frage würde ich Dir hiervon aber eher abraten ;-)

    Mein Tipp:
    Besorg Dir nen brauchbaren Player wie z.B. den hier:
    http://www.jeroenwijering.com/?item=JW_FLV_Player
    Und schau dann, ob Du ein H.264 kodiert bekommst, welches sich hiermit abspielen lässt.

    Grüße

    1. Hi Dirk,

      Also, die Codecfrage ist bereits soweit für mich geklärt. Trotzdem danke für die Empfehlung von H.264 ;)
      Auch der von dir verlinkte Player sieht klasse aus.

      (...) Seit Flash 8 gibt es einen Pool an Filtern, z.B. ein Weichzeichner ist dabei. AFAIK aber kein Scharfzeichner.
      Wenn es diesen denn geben sollte, müsste man aber vermutlich mit merklichen Performance Einbußen rechnen.

      Performance sollte (aufgrund eines anzunehmend starken Client PCs) keine Rolle spielen - aber vielleicht habe ich auch eine falsche Vorstellung:
      Ich dachte, dass (übertragen auf die mir bekannte avi Welt):
      -Die FLV Datei den AVI darstellt
      -Die SWF Datei den Mediaplayer darstellt
      -Und die Html-anbindung das ganze in ein Browserfenster pfercht.
      Weiterhin dachte ich:
      HTML Seite (incl. SWF <object> tag) und SWF(Player) werden bei HTML-Seiteninitialisierung auf den Client übertragen, der SWF Player zieht dann die Daten aus dem FLV nach.
      Und nun hatte ich gehofft, dass es möglich wäre, dass der SWF Player die (Bild)Daten bevor er sie ausgibt, mit einem (Scharfzeichnungs-) Filter rendert.
      Somit wäre also ganz konkret nochmal die Frage: Gibt es eine Möglichkeit, oben beschriebenes Rendering-Verhalten in einen bestehenden SWF Player zu integrieren - wenn ja, wie? Oder kann man dafür einen SWF Player selbst schreiben - wenn ja, wie?
      FLEX kenne ich als fast lexical analyser (so'n Ding für reguläre Ausdrücke und Compilerbau) - sowas wird für SWF-Generierung verwendet?

      Aber auf jeden Fall schon mal vielen Dank.

      Viele Grüße,
      Richard

      1. Hi.

        Der von Dir geschilderte Ablauf ist zwar nicht 100% präzise, passt aber schon. Auch der Ansatz "Bevor der SWF Player die Bilddaten darstellt, soll er den Filter anwenden" ist möglich.
        AFAIK gibt es aber keinen direkten Scharfzeichnungsfilter.

        Ganz krasse Idee: Arbeite mit dem Bitmapdata Objekt und greife die Bilddaten ab. Dann musst Du dich nur noch mit Scharfzeichnungsalgorithmen beschäftigen und (z.B. ActionScript) implementieren. Das würde dann aber noch viel langsamer, also die Flash eigenen Filter.
        Solltest Du das tatsächlich probieren wollen, poste hier bitte mal Deine Erfahrungen ;-)

        Nochmals: Den Codec zu überdenken scheint mir sinnvoller. Selbst wenn Du dich in kürzester Zeit zum Flashguru ausbildelst, einen eigenen Player schreibst sowie einen bahnbrechenden Scharfzeichnungsalgorithmus erfindest und implentierst: Das Ergebnis wird in keinem Verhältnis zu den Alternativen stehen: Höhere Bitrate / Besserer Codec.

        Flex SDK:
        http://opensource.adobe.com/wiki/display/flexsdk/
        ;-)

        Grüße

        1. Hi Dirk!

          Danke für die Tips und den Link - ich hab mich mal ein wenig eingelesen und versuche nun zu skizzieren, wie ich das verstehe:

          1. nehmen wir mal an, dass ich den H.264 Codec kenne und für das Projekt als besten Codec erachte - dann wäre die Codec Frage im FLV Container ja geklärt.

          2. eine höhere Bitrate erfordert ein größeres FLV - dies ist, wie bereits erklärt - ja nicht das Ziel

          3. ich will also weiter meinen Scharfzeichner und es folgt also weiter aus den bisherigen Tips:

          4. Actionscript: Hiermit scheint folgendes möglich:
              - ein Display Objekt myVideo (Video/VideoPlayer/FLVPlayback) kann mit einer FLV Source verbunden werden
              - dieses kann in ein Bitmap übertragen werden mittels:
                   var myBmd:BitmapData = new BitmapData (myVideo.width, myVideo.height)
                   myBmd.draw (myVideo)
                //Hier unklar: wie wird festgelegt, welcher Zeitindex des Streams in myBmd angelegt wird, oder anders: wie bekomme ich den Stream/das Display Objekt dazu (ohne es zu zeigen) dass er für jedes neue Bild eine Funktion anstößt, die dieses Bild in myBmd kopiert (und weiters tut)?

          - mittels getPixels(), Matrix und setPixels() sollte ich den Scharfzeichner hinbekommen
             - Anschließend wird mittels Bitmap(myBmd) der scharfgezeichnete Inhalt gezeigt.

          Soweit so gut.
          Nun zu Flex: Flex habe ich so verstanden, dass es sich um einen Compiler handelt, der mittels eines xml Derivats (MXML) und des erzeugten Actionscripts im Folgenden eine fertige SWF Datei erzeugen kann, die dann (nachdem ja die Quelle (Actionscript) anscheinend Java ist) aus Bytecode besteht?
          Funktioniert das ganze auch ohne Flex (also direkt als Action Script)?

          Vielen Dank für alle bisherigen Tips,

          Richard

          1. Moinmoin.

            1. nehmen wir mal an, dass ich den H.264 Codec kenne und für das Projekt als besten Codec erachte - dann wäre die Codec Frage im FLV Container ja geklärt.
            2. eine höhere Bitrate erfordert ein größeres FLV - dies ist, wie bereits erklärt - ja nicht das Ziel

            Sofern meine Anfangs getroffene Mutmaßung "Du(dein Tool) verwendest den Sorenson Spark Codec für die FLVs" stimmt, wirst Du mit dem Wechsel auf H.264 womöglich bei gleichbleibender Dateigröße des FLV einen ausreichenden Qualtitätssprung erleben, um den fraglichen Text gut lesen zu können.

            1. ich will also weiter meinen Scharfzeichner und es folgt also weiter aus den bisherigen Tips....

            Ich rate Dir hiervon weiter ab ;-)

            Hier unklar: wie wird festgelegt, welcher Zeitindex des Streams in myBmd angelegt wird, oder anders: wie bekomme ich den Stream/das Display Objekt dazu (ohne es zu zeigen) dass er für jedes neue Bild eine Funktion anstößt, die dieses Bild in myBmd kopiert (und weiters tut)?

            In Flash kannst beliebig viele Elemente(=MovieClips) übereinander legen. Der oberste überlagert immer den Rest(Transparenzen und Alpha Werte mal nicht betrachtet). Dein BitmapData Ding könntest Du also oberhalb des eigentlichen Video Bildes platzieren.
            Ansonsten wirst Du dich erstmal durchkämpfen müssen, die von Dir genannten Stichworte gehen in die richtige Richtung.
            LETZTE WARNUNG: DON`T DO IT ;-)

            Flex habe ich so verstanden, dass es sich um einen Compiler handelt, der mittels eines xml Derivats (MXML) und des erzeugten Actionscripts im Folgenden eine fertige SWF Datei erzeugen kann, die dann (nachdem ja die Quelle (Actionscript) anscheinend Java ist) aus Bytecode besteht?
            Funktioniert das ganze auch ohne Flex (also direkt als Action Script)?

            Du brauchst irgendwas, um den Bytecode für die VM des Flash Players zu erzeugen(z.B. Flex, OpenLaszlo). Das hat mit Actionscript erstmal nix zu tun.

            Grüße

  2. Seid gegrüßt!

    P.S.: ein Runterfahren der Kompression des FLV würde zwar auch mein Problem lösen, stellt aber nur eine Notlösung dar, da die Datei dann wieder grösser wird...

    Ich habe keinen Plan von FLV - allerdings dachte ich, dass FLV nur ein Containerformat ist und intern sowieso ein Codec angewandt wird. Evtl. kann man hier einen anderen Codec nutzen, der trotz hoher Komprimierung ein klares Bild liefert.

    --
    Bis Später
    RuD
    ________________________________________________________________
    SelfCode: ie:% fl:( br:^ va:) ls:< fo:| rl:( n4:& ss:) de:> js:| ch:| mo:| zu:)