BufferQueue wurde verlassen: Bei der Wiedergabe von Video mit TextureView

8

Jedes Mal, wenn ich meine Aktivität (eigentlich Fragment) pausiere, um zu einer anderen App zu gehen, versuche ich bei der Rückkehr mit onResume das Video wiederzugeben, aber es spielt nicht: Ich bekomme einen leeren Bildschirm. Nach der Untersuchung sehe ich Folgendes in der Logcat

%Vor%

Hier ist der Code, den ich innen auf Lebenslauf

rufe %Vor%

Zu Ihrer Information: Ich habe versucht, diese Antwort auf meinen Fall anzuwenden, aber ich kann nicht: Was kann ich tun, wenn die BufferQueue abgebrochen wurde?

AKTUALISIEREN

Ich kämpfte darum, es alleine zu machen, aber ich stoße immer noch zusammen. Also poste ich den ganzen Code für Hilfe

%Vor%     
learner 22.10.2015, 18:38
quelle

3 Antworten

8

Ich hatte das gleiche Problem beim Umschalten zwischen den Aktivitäten und hatte auch MediaPlayer (1971): Error (100,0). Gelöst, indem Sie diese Zeilen in onSurfaceTextureDestroyed

hinzufügen %Vor%     
Joks 25.02.2016 15:57
quelle
0

Es scheint einen Bug in Ihrem Code zu geben: In SurfaceTextureDestroyed () haben Sie die Oberfläche oder den MediaPlayer nicht zurückgesetzt. Wenn resume, weder mediaPlayer noch Oberfläche ist null, so in resumeVideoUponReturningFromAnotherActivity () legen Sie die Oberfläche und Aufruf starten zu spielen, aber Oberfläche bereits wegen der vorherigen SurfaceTextureDestroyed ungültig werden. Deshalb erhalten Sie einen Fehler.

Um es zu beheben, sollten Sie die Oberfläche im Callback SurfaceTextureDestroyed zurücksetzen. Wenn Sie fortfahren, bauen Sie die Oberfläche im Callback SurfaceTextureAvailable neu auf, legen Sie sie auf mediaPlayer fest und rufen Sie start to play auf. Die Codes gehen so:

%Vor%

Und Sie müssen den Media Player überhaupt nicht zurücksetzen. Wenn Sie es zurücksetzen, müssen Sie es erneut instanziieren und erneut puffern, was zu Verzögerungen führt. Dies schadet der Benutzererfahrung, da keine verzögerte Pause / Fortsetzung mehr erwünscht ist.

    
alexhilton 12.10.2016 13:22
quelle
0

Ich finde setSurface(null) ist nützlich.

Wenn Sie eine TextureView verwenden, um etwas anzuzeigen, wenn TextureView.SurfaceTextureListener callback onSurfaceTextureDestroyed aufgerufen wurde, müssen Sie die Verwendung von SurfaceTexture/new Surface(SurfaceTexture) binded von camera2 , MediaCodec oder MediaPlayer beenden.

So

%Vor%     
miao 22.11.2017 09:19
quelle