2010-01-13 15 views
15

Ich wollte herausfinden, wie man Screencast mit Java erfassen kann. Ich weiß, dass man mit Robot class one einen Screenshot bekommen kann, aber wie soll ich ihn als Video aufnehmen und dann auf den Server hochladen? Wie genau würde das funktionieren?Java Applet Screen Capture zu einem Video

Ideen?

+0

David, ich kann Fragen Sie, ob ich den Quellcode Ihrer Screencast-App für Lernzwecke sehen kann? Danke – user1030434

Antwort

14

Mit einer reinen Java-Lösung bezweifle ich, dass es funktioniert, aber es hängt natürlich davon ab, was Sie für die Interpretation von "Video".

Auf meinem Desktop mit einer Auflösung von 1920x1200 bin ich in der Lage, ungefähr 20 Bilder pro Sekunde zu erhalten, wenn ich den Java-Roboter verwende, um den gesamten Bildschirm zu erfassen. Da jedes Bild> 6 MByte unkomprimierte Daten enthält, würde ich mehr als 1 GBit/s Bandbreite benötigen, um die Rohdaten dieser Bilder an einen Server zu übertragen. Höchstwahrscheinlich ist es nicht akzeptabel, so viel Bandbreite zu benötigen. Sie müssen also entweder die Anzahl der Bilder pro Sekunde verringern oder eine Art Kompression auf die Bilder anwenden.

Eine Möglichkeit besteht darin, jedes Bild mit einem der von ImageIO unterstützten Bildformate zu komprimieren. Die Größe der komprimierten Bilder hängt natürlich stark davon ab, was tatsächlich auf dem Bildschirm angezeigt wird, aber die Leistung der Kompressoren ist nicht besonders gut. Komprimierung nach PNG sollte die beste verlustfreie Kompressionsrate für die meisten Desktop-Inhalte bieten, aber zumindest kann mein Computer nur etwa 2 Bilder pro Sekunde verarbeiten. Die Verwendung des JPEG-Komprimierers mit Standardqualitätseinstellungen erreicht etwa 5 Bilder pro Sekunde.

Mit herkömmlichen Videocodecs durch eine Abstraktionsschicht wie jffmpeg wird wahrscheinlich sowohl eine bessere Leistung als auch eine bessere Komprimierungsrate erreicht, aber ich bezweifle, dass gängige Videocodecs wie WMV oder H.264 für allgemeine Desktopinhalte geeignet sind.

Wenn Sie wirklich eine reine Java-Lösung benötigen (und keine der verfügbaren eigenständigen Software verwenden können, die das tun, wonach Sie fragen), würde ich versuchen, meinen eigenen einfachen Komprimierungsalgorithmus zu implementieren. Bei üblicher Desktop-Aktivität sollte zwischen den meisten aufeinander folgenden Screenshots kaum ein Unterschied bestehen. Was also gut funktioniert, ist, den ersten Frame vollständig zu übertragen und danach einen Algorithmus zu implementieren, um Rechtecke, in denen Änderungen vorgenommen wurden, grob zu erkennen Übertragen Sie nur diese kombiniert mit JPG oder vorzugsweise (Qualität) PNG-Komprimierung.

+0

Wie macht es screencast-o-matic.com mit einer so schönen Bildrate? Ich verstehe und stimme mit Ihnen überein, dass ein sehr guter Komprimierungsalgorithmus benötigt wird. – Obaid

+0

Woher soll ich das wissen? Zunächst erfassen sie nur einen kleinen Teil des Bildschirms (640x480?) Und ein Teil des Applets ist in nativem Code implementiert. Vielleicht gelingt es Ihnen, über den dekompilierten Applet-Code zu debuggen, wenn Sie es wirklich wissen wollen. – jarnbjo

+0

+1 Netter Versuch zu erklären. Vielen Dank. – Favonius

4

Oder verwenden Sie Xuggler, einen besseren Wrapper für FFmpeg in Java. In der Tat ist der Code für die Erfassung des Bildschirms und die Codierung des Videos einer der standard tutorials.

+0

Xuggler lässt mich die lib nicht als Applet ausführen. (oder fehle ich etwas?) – Obaid

+0

Das stimmt; Heute unterstützt es keine Applets, aber es ist auf unserer Roadmap für die Zukunft. –

2

Ich bin auch neugierig auf diese. https://www.screencast.com/ macht gerade dies mit einer reinen Java-Erfahrung (oder zumindest direkt aus dem Browser).

2

Sie können etwas wie Java zu einem nativen FFMPEG-Build verwenden und die Befehlszeile zur Laufzeit ausführen. Hier ist ein Applet, das ich gemacht habe, das genau das tut: http://have2chat.net/screencast/

+0

Wenn es möglich ist, können Sie den Lerncode für Lernzwecke teilen? Es wäre wirklich toll, wenn du zeigen könntest, wie du von Applet – Jatin