Рисовать вручную на поверхности MediaPlayer

У меня есть TextureView, который я установил для MetoaPlayer для воспроизведения видео:

TextureView textureView = new TextureView(context);
addView(textureView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
textureView.setSurfaceTextureListener(this);

@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {}

@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}

@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface)
{
    return false;
}

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height)
{
    this.surface = new Surface(surface);
    mediaPlayer.setSurface(this.surface);
    prepareAndPlay();
}

Видео играет нормально.

Но когда я пытаюсь рисовать вручную на поверхности, воспроизведение видео не начинается!

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height)
{
    this.surface = new Surface(surface);
    mediaPlayer.setSurface(this.surface);

    // DRAW FIRST FRAME ON SURFACE

    Bitmap bitmap = BitmapFactory.decodeFile(firstFramePath);
    Canvas canvas = surface.lockCanvas(null);
    canvas.drawBitmap(bitmap, new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()), new Rect(0, 0, canvas.getWidth(), canvas.getHeight()), null); 
    bitmap.recycle();
    surface.unlockCanvasAndPost(canvas);

    prepareAndPlay();
}

Когда я вызываю play() на медиаплеере, воспроизведение не начинается.

Я полагаю, что Surface перешел в недопустимое состояние, а MediaPlayer не может воспроизводить видео. Но logcat пуст. Есть возможность рисовать на одной поверхности как с помощью медиаплеера.

1 ответ

Решение

Вы не можете сделать это.

"Поверхность" - это сторона производителя пары производитель-потребитель. У вас не может быть двух продюсеров. (Если вы хотите узнать подробности, см. Этот документ.)

С TextureView вы можете изменить базовую SurfaceTexture, используя setSurfaceTexture(), который должен позволить вам переключаться с одного на другой. Эта функция используется (по разным причинам) в деятельности Grafika "двойное декодирование".

Другие вопросы по тегам