2014-10-14 12 views
10

Sto usando un ListView con i bambini TextureView. TextureView utilizza un MediaPlayer per riprodurre video. Quando TextureView viene riciclato, l'ultimo frame rimane sulla superficie fino a quando il successivo MediaPlayer non ne fa uso.Come cancellare SurfaceTexture dopo averlo utilizzato con un MediaPlayer?

Qual è il modo più semplice per "cancellare" la superficie di TextureView (ad esempio nero) in modo che i vecchi frame non vengano visualizzati?

risposta

7

Dopo aver lottato con questo per un po ', mi è venuta in mente un paio di possibili soluzioni:

a) cancellare la superficie con GLES. È possibile visualizzare un esempio in Grafika (consultare il metodo clearSurface()). Personalmente non ne sono un fan perché non penso che una transizione stridente in nero appaia particolarmente buona, ed è un bel po 'di spese generali tecniche se non si sta già utilizzando il codice GL. Inoltre, sembra funzionare solo per API 17+.

b) La soluzione scelta era semplicemente creare un nuovo TextureView e aggiungerlo alla vista appropriata ogni volta che volevo riprodurre un video, invece di riutilizzarne uno vecchio. Vorrei esitare a chiamare questa soluzione buona, ma è la meno orribile che ho trovato.

c) Una cosa che potresti essere in grado di fare se stai riproducendo lo stesso video è cercare di cercare il primo fotogramma del video quando è finito. Quindi la prossima volta che l'ultimo fotogramma lampeggia, non sarà visibile poiché sarà lo stesso fotogramma dell'inizio del video. Ho avuto un certo successo con questo, ma non ho potuto farlo funzionare in modo affidabile su tutti i dispositivi. È anche chiaramente un hack.

Buona fortuna, questo è stato immensamente frustrante per cercare di risolvere.

+1

C'è anche (d) aggiungere una vista vuota in cima a TextureView. Nascondilo mentre giochi video, mostralo quando la riproduzione si ferma. – fadden

+1

Il problema, almeno quello che ho trovato, è che il video lampeggerà il primo fotogramma all'avvio della riproduzione, anche dopo la chiamata MediaPlayer onPrepared. Non sono riuscito a trovare un modo per determinare quando la trama era effettivamente pronta! Se c'è una cosa del genere, mi piacerebbe saperlo. – gcgrant

+0

So che è vecchio ma riesci a condividere il tuo codice per b)? Purtroppo non sono riuscito a trovare alcuna soluzione per lavorare in modo affidabile. –

Problemi correlati