native_window_api_connect hat einen Fehler zurückgegeben: Ungültiges Argument (-22)

8

Ich schreibe eine Video-Player-Anwendung mit MediaCodec-API. Ich muss einen leeren Bildschirm anzeigen, bevor die Videodekodierung gestartet wurde. So verwende ich den folgenden Code, um den leeren Bildschirm anzuzeigen.

%Vor%

Danach beginnt die Video-Decodierung. Aber zum Zeitpunkt der Konfiguration

%Vor%

es gibt folgende Fehler

%Vor%

Also stürzt meine App mit diesem Fehler ab. Ohne diesen leeren Bildschirm funktioniert der Code-Decoder einwandfrei. Wie kann ich dieses Problem lösen?

    
saa 03.02.2014, 12:06
quelle

1 Antwort

6

Hier ist meine Theorie, basierend auf einem kurzen Blick durch den Framework-Code.

Die Canvas-Sperroperation wird (möglicherweise) in Surface::lock() ( Code hier ). Das hat ein Stück Code, der sagt:

%Vor%

Dies verbindet einen "CPU-Erzeuger", d. h. einen Code, der auf der CPU läuft und Graphikdaten erzeugt, mit der Erzeugerseite der Pufferwarteschlange, die in die Oberfläche eintritt. Dieser Producer wurde nicht in unlockAndPost() getrennt. Sie können den Disconnect-Aufruf tatsächlich im Surface-Destruktor finden, der für Ihre Zwecke etwas zu spät ist.

Sie können nicht zwei Producer in einer Pufferwarteschlange haben. Wenn Sie Surface an den MediaCodec-Decoder übergeben, kann keine Verbindung hergestellt werden.

Ich glaube, Sie haben ein paar Optionen:

  1. Löschen Sie die Oberfläche mit OpenGL ES. Wenn du EGLSurface zerstörst, wird die Verbindung getrennt. Dies erfordert das Einrichten von EGL / GLES und das Abrufen des EGL-Freigabecodes.
  2. Erstellen Sie ein leeres Rechteck mit einem anderen Ansatz als dem Zeichnen auf SurfaceView selbst (h / t mein Bürokollege).

Für Ansatz 2 benötigen Sie nur eine zweite Ansicht (vielleicht eine ImageView ) mit der gleichen Position und den gleichen Dimensionen wie die SurfaceView und füllen sie mit opakem Schwarz. Der SurfaceView -Layer befindet sich immer unter allem anderen (vorausgesetzt, Sie haben ihn nicht so konfiguriert, dass er oben ist), sodass die UI-Elemente darüber gezeichnet werden. Wenn es Zeit ist, den Film zu starten, deaktivieren Sie die andere Ansicht.

Update: Sie können jetzt Approach # 1 in Grafika sehen. In der Aktivität "Film abspielen (SurfaceView)" erstellt es einen EGL-Kontext, löscht die Oberfläche und zerstört den Kontext. (Es ist notwendig, den EGL-Kontext und die Oberfläche sofort zu löschen, um das Problem "zwei Produzenten" zu vermeiden.)

    
fadden 04.02.2014 21:49
quelle