Textur-Ansicht, video-und Bitmap-display
Ich habe eine TextureView zeigt, dass ein bitmap(Platzhalter-Bild) und wenn der Nutzer lädt ein video der textureView sollte zeigen das video.
Ich es geschafft, die video-Wiedergabe in der textur-Ansicht und zeigt eine bitmap in eine textureview, aber wenn Sie getan werden, in der Folge, bekomme ich nur einen schwarzen Bildschirm.
In meinem onSurfaceTextureAvailable Methode, die ich zeichnen einer bitmap auf der Oberfläche anzeigen wie folgt:
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.ic_add_clip);
Canvas canvas = lockCanvas();
canvas.drawBitmap(bm, (width/2)-(bm.getWidth()/2), (height/2)-(bm.getHeight()/2), null);
unlockCanvasAndPost(canvas);
}
Wenn der Benutzer wählt ein video aus der Galerie lade ich die Uri im Media player, und legen Sie die Oberfläche der mediaplayer. Aber das bitmap wird immer noch angezeigt. ich versuchte, entfernen Sie die bitmap durch das löschen des canvas, und es tut, entfernen Sie die bitmap, aber dann ist die textur-Ansicht einfach schwarz und wird nicht angezeigt, das video ebenfalls.
public void setMediaPlayer(MediaPlayer mediaPlayer) {
//Canvas canvas = lockCanvas();
//canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
//unlockCanvasAndPost(canvas);
Surface s = new Surface(getSurfaceTexture());
mMediaPlayer = mediaPlayer;
mMediaPlayer.setSurface(s);
mMediaPlayer.setOnPreparedListener(this);
}
Etwas sagt mir, dass die Oberfläche Blick ich bin mit der Anzeige des Videos ist hinter der bitmap, die ich ziehen im TextureAvailble. Und wenn ich versuchen, deaktivieren Sie die Leinwand, die ich auch klar die Oberfläche, die den mediaplayer nutzen will. Alle Lösungen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Methode nicht funktionieren.
Die Oberfläche ist ein Puffer-queue mit einer Erzeuger-Verbraucher-Beziehung. Es kann nur ein Produzent in einer Zeit, und Sie haben zwei Produzenten (Leinwand und MediaPlayer). Wenn Sie anrufen
mMediaPlayer.setSurface()
es legt MediaPlayer; wenn Sie anrufenlockCanvas()
es legt Leinwand. Sie müssen zu trennen, bevor Sie anbringen können, die andere.(Überprüfen Sie Ihre logcat-Ausgabe-es gibt wahrscheinlich auch einige, die "schon verbunden" Beschwerden dort).
Das Problem ist, während Sie sollte in der Lage sein zu trennen MediaPlayer, können Sie nicht zu trennen Leinwand. Es gibt einfach kein Anruf, dass es tut. Dies ist eine unglückliche Artefakt in der API. (Bestätigt durch 4.4 "KitKat", und ich bezweifle, dass es seitdem geändert hat.)
Haben Sie ein paar Optionen:
clearSurface()
- Methode, die nur löscht den Bildschirm. Mit GLES, können Sie anfügen und trennen von der Oberfläche.Sollte ich hinzufügen, dass ich noch nicht wirklich versucht, abnehmen ein MediaPlayer von einer Oberfläche. Die untere Ebene MediaCodec funktioniert auf diese Weise, wie gezeigt, durch die Grafika Spieler, daher gehe ich davon MediaPlayer auch sauber trennen. Für Ihren Fall, obwohl, #3 ist wahrscheinlich die einfachste Lösung und erfordert keine attach - /detach-gymnastik.
Können Sie die opengl verwenden es zum zeichnen einer bitmap auf den Bildschirm , und zeichnen Sie video-frame mit der gleichen Weise. Ich habe auf diese Weise und es funktioniert gut.