Четкое отображение 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;
}
}
Ответы
Ответ 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);