Подтвердить что ты не робот

Как очистить держатель поверхности при завершении работы медиаплеера?

Я сделал видеоплеер с видом на поверхность и медиаплеер. У меня есть 10 видеороликов и 10 кнопок. если щелкнуть по каждой кнопке, воспроизводятся все видеоролики.

вот мой код..

//onCreate   
holder = surfaceview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


//Button1
if(mp == null)mp = new MediaPlayer();

mp.setDataSource(mediaplay_path);
mp.setDisplay(holder);
mp.setScreenOnWhilePlaying(true);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepare();
mp.start();


//Button2
if(mp != null){
    mp.stop();
    mp.reset();
}

mp.setDataSource(mediaplay_path2);
mp.setDisplay(holder);
mp.setScreenOnWhilePlaying(true);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepare();
mp.start();

//Button3~Button10 is same as Button2..

все в порядке. мой пользовательский видеовизор работает нормально. но когда видео переходит к следующему, последний эпизод предыдущего видео остается на некоторое время и переходит к следующей видеосессии.

Я думаю, потому что предыдущий обзор поверхности должен быть ясным до того, как начнется следующее видео. но я понятия не имею, как очистить поверхность или держатель поверхности.

Я искал это, но мог только найти, как воспроизвести видео, а не как очистить представление о поверхности, которое устанавливает отказ от медиапланера.

пожалуйста, помогите мне ~~!

4b9b3361

Ответ 1

SurfaceHolder имеет методы lockCanvas, которые позволят вам напрямую рисовать в Surface. Используйте drawColor метод Canvas, чтобы заполнить его черным цветом.

Тем не менее, может быть предпочтительнее удалить SurfaceView (как было предложено smile2you), потому что это должно полностью уничтожить Surface и освободить неиспользуемые ресурсы. И обязательно убедитесь, что вы вызываете release на MediaPlayer после того, как они сделаны с воспроизведением. Удержание слишком большого количества видео ресурсов приведет к краху вашего приложения.

Ответ 2

Мне понадобилось две недели, чтобы понять это. Установив поверхностный держатель на TRANSPARENT, Android уничтожит поверхность. Затем, устанавливая его обратно на OPAQUE, создается новая поверхность, очищающая поверхность. Обратите внимание, что события создания поверхности и surfacedestroy будут срабатывать, поэтому, если у вас есть код, будьте осторожны. Я поставил изображение в черный цвет, чтобы сделать его черным фоном. Там могут быть лучшие способы для этого.

private void playVideoA() { 
     imageViewBlack.bringToFront();
     surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
     surfaceHolder.setFormat(PixelFormat.OPAQUE);
     surfaceView.bringToFront();
     mediaPlayerA.setDisplay(surfaceHolder);
     //surfaceView.setAlpha((float) 0.01);
     mediaPlayerA.start();
};
private void prepareVideoA(String url) {
     try {
        mediaPlayerA = new MediaPlayer();
        mediaPlayerA.setDataSource(url);
        mediaPlayerA.prepareAsync();
        mediaPlayerA.setOnPreparedListener(this);
        mediaPlayerA.setOnCompletionListener(this);
        mediaPlayerA.setOnBufferingUpdateListener(this);
        mediaPlayerA.setOnInfoListener(this);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
};
@Override
public void onPrepared(MediaPlayer mp) {
     playVideoA()
}

Ответ 3

video.getHolder().setFormat(PixelFormat.TRANSPARENT);
video.getHolder().setFormat(PixelFormat.OPAQUE);
video.setVideoURI(Uri.parse(temp));
video.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
      mp.start();
   }
});

он работает для меня

Ответ 4

Возможно, вы можете использовать removeView для удаления старого видеоизображения custome, а затем добавить новый вид

Ответ 5

surfaceview.setVisibility(View.GONE);