Was ich bisher versucht habe:
Konvertiere jedes Bild in eine Bitmap, verwische es mit der Bibliothek und lege es in ImageView
, was vor der Kameravorschau steht. Offensichtlich war zu langsam - so etwas wie 1 fps .
Dann habe ich angefangen, RenderScript zu verwenden, das jeden Frame verwischt und das Ergebnis der Verarbeitung sollte in TextureView
platziert werden, was eine Vorschau der Cover-Kamera ist.
Wesentliche Teile des Codes dieses Ansatzes:
Weichzeichner
%Vor%MainActivity
%Vor%activity_main.xml
%Vor%Und leider ist es immer noch zu langsam - 3-4 FPS . Auch die Unschärfe-Überlagerung wird gedreht, aber es ist ein anderes Problem.
Ich habe ein Testprojekt auf Github erstellt , in dem Sie Probleme schnell reproduzieren und überprüfen können, wie es funktioniert ist möglich zu optimieren. Ich freue mich auf Ihre Ideen.
UPD Ich konnte die Leistung verbessern, indem ich das Eingabedatum vor dem Weichzeichnen herabsetzte. Ich habe diese Änderungen auf Repo getestet. Jetzt habe ich eine wirklich gute (15-20 FPS) -Leistung, selbst auf Low-End-Geräten, aber mit niedriger Auflösung (HD zum Beispiel), und nicht gut genug auf FHD und UHD ( (8- 12 FPS) .
Ich denke, der beste Ansatz, den Sie wählen können, ist es, CameraView
durch TextureView
zu ersetzen und es als Kameravorschau zu verwenden. Beispiele dafür finden Sie hier Ссылка und hier
Ссылка .
Der nächste Schritt ist die Verwendung eines Unschärfe-Shaders in deinem TextureView
. Hier finden Sie ein Beispiel:
Ссылка
Sie können diesen Shader verwenden oder einen schöneren suchen.
Falls Sie eine fertige Lösung wünschen, können Sie sich diese Bibliothek ansehen: Ссылка
Damit können Sie Shader auf eine Videoansicht anwenden. Sie können also wieder einen unscharfen Shader verwenden, um den gewünschten Effekt zu erzielen.
Beispiel für diese Bibliothek: Ссылка
BEARBEITEN
Also gab ich eine großartige Bibliothek von Nekocode und fügte einen funktionierenden Unschärfefilter hinzu. Bitte sehen Sie meine letzte Verpflichtung. Ссылка
Wie ich schon sagte, Texturlayer + GL Shader. Um den Unschärfe-Shader zu aktivieren, klicken Sie auf das Menü in der oberen rechten Ecke und wählen Sie die entsprechende Option.
Wenn Sie einen schnelleren / besseren / einfacheren Unschärfe-Shader benötigen, können Sie ihn auf Ссылка
suchenAuf einigen Geräten könnte die Kameravorschau umgedreht werden, aber das ist ein anderes Problem, das es zu lösen gilt.
Welche Art von Unschärfe brauchen Sie? Video in der Laufzeit ändern sehr komplizierte Aufgabe, und am effizientesten ist es mit einfachen Maske. Und nur Maske, wird für unsere Aufgaben passen. Auch zum Speichern von Video wenden wir nicht nur Transformation an, sondern nehmen Video Frames mit unserer Maske auf.
In Ihrem Fall können Sie CameraView
in eine neue Maske mit der Aktion "Blau" umbrechen. Daher haben Sie Layouts wie hier eingefügt.
Und dann verwischte Maske in FrameLayout
view anwenden. Für Beispiel Hintergrund festlegen, wie es In diesem Beispiel zeigt
Tags und Links android camera blur renderscript