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

Четкое отображение Android VideoView после stopPlayback()

Я использую компонент VideoView для воспроизведения видео. Кажется, я не могу очистить дисплей VideoView после того, как я вручную вызову stopPlayback(). Я хотел бы reset VideoView, чтобы был видимым исходный фон.

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

Код, который я использую:

private VideoView videoViewer = null;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
  if (videoViewer != null) {
    videoViewer.setOnPreparedListener(new OnPreparedListener());
  }
...
}

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  if (videoViewer != null) {
    videoViewer.stopPlayback();
    videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8"));
  }
}

private class OnPreparedListener implements MediaPlayer.OnPreparedListener {
  @Override
  public void onPrepared(MediaPlayer mp) {
    videoViewer.start();
  }
}

Обратите внимание, что на основе источника VideoView.java stopPlayback() выполняет следующие действия на базовом MediaPlayer:

public void stopPlayback() {
  if (mMediaPlayer != null) {
    mMediaPlayer.stop();
    mMediaPlayer.release();
    mMediaPlayer = null;
  }
}
4b9b3361

Ответ 1

Для меня то, что работало, было просто скрыть, затем показать VideoView с помощью setVisibility.

public void clearCurrentFrame() {
    videoView.setVisibility(GONE);
    videoView.setVisibility(VISIBLE);
}

Это было потому, что я хотел, чтобы VideoView стал прозрачным, а не сплошным цветом. Настройка фона на прозрачность не работает - показывается видеокадр.

Ответ 2

Решение, на котором я остановился, если кто-то не может предложить лучший, заключается в использовании setBackgroundResource, который кажется странно названным, поскольку он, похоже, изменяет ресурс переднего плана.

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
  videoViewer.setBackgroundResource(R.drawable.viewer_background);
...
}

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  if (videoViewer != null) {
    videoViewer.stopPlayback();
    // Set the background back to the drawable resource to clear the current video when switching to a new one.
    videoViewer.setBackgroundResource(R.drawable.viewer_background);
    videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8"));
  }
}

private class OnPreparedListener implements MediaPlayer.OnPreparedListener {
  @Override
  public void onPrepared(MediaPlayer mp) {
    videoViewer.start();
    // Clear the background resource when the video is prepared to play.
    videoViewer.setBackgroundResource(0);
  }
}

Подходящее я ссылаюсь на простой layer-list с пользовательским синим фоном и центрированным логотипом.

вытяжка\viewer_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  <item>
    <shape android:shape="rectangle">
      <solid android:color="@color/custom_blue" />
    </shape>
  </item>
  <item>
    <bitmap android:src="@drawable/img_logo"
      android:gravity="center" />
  </item>
</layer-list>

В качестве альтернативы я также мог использовать setZOrderOnTop для управления местом размещения поверхности (вы также можете определить другой вид поверх VideoViewer и переключить видимость таким образом):

videoViewer.setZOrderOnTop(false);
videoViewer.setZOrderOnTop(true);

В качестве альтернативы я мог бы также использовать setBackgoundColor для выполнения той же функции, что и setBackgroundResource:

videoViewer.setBackgroundColor(getResources().getColor(R.color.custom_blue));
videoViewer.setBackgroundColor(Color.TRANSPARENT);

Ответ 3

только этот код:

videoView.setVideoURI(null);

Ответ 4

Ну, для меня ни один из решений из этого потока не работал, поэтому я попробовал что-то еще и ниже - это решение, которое сработало для меня,

new Handler().postDelayed(new Runnable() {

     @Override
     public void run() {
        mVideoViewPlayList.setVisibility(View.GONE);
        mVideoViewPlayList.setVisibility(View.VISIBLE);
        mVideoViewPlayList.setVideoURI(Uri.parse(path));
    }
}, 500);

Ответ 5

Вы можете сделать так;

videoView.stopPlayBack();   
 videoView.seekTo(0);  

надеюсь, что это может помочь вам

Ответ 6

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

MediaController mediaController = new MediaController (this); 
videoView.setMediaController(mediaController);