VideoView播放視訊黑屏問題處理
阿新 • • 發佈:2019-01-30
前言
你又擦肩而過
你耳機聽什麼
能不能告訴我
…….
記得 我寫給你的情書
都什麼年代了
到現在我還在寫著
總有一天總有一年會發現
有人默默的陪在你的身邊
也許 我不該在你的世界
當你收到情書
也代表我已經走遠
簡介
Android原生播放器VideoView在播放視訊前會有黑屏問題,我們可以在視訊播放前預先展示張預覽圖,等到視訊真正開始播放時再隱藏預覽圖。
xml檔案
<VideoView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ImageView
android:id="@+id/preview_image_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
許可權
需要新增網路請求許可權
<uses-permission android:name="android.permission.INTERNET"/>
圖片載入庫
這裡圖片載入我們使用glide,在build.gradle中新增依賴
implementation 'com.github.bumptech.glide:glide:3.7.0'
實現
public class MainActivity extends AppCompatActivity {
private static final String TEST_VIDEO_URL = "http://wvideo.spriteapp.cn/video/2018/0109/f22ea9a8f4a911e784f8842b2b4c75ab_o4n.mp4";
private static final String TEST_IMAGE_URL = "http://wimg.spriteapp.cn/picture/2018/0109/f22ea9a8f4a911e784f8842b2b4c75ab_wpd.jpg";
private static final long HIDE_IMAGE_DELAY = 100;
private VideoView mVideoView;
private ImageView mPreviewImageView;
private int mCurrentPosition;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mVideoView = findViewById(R.id.video_view);
mPreviewImageView = findViewById(R.id.preview_image_view);
//使用glide載入預覽圖片
Glide.with(this)
.load(TEST_IMAGE_URL)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(mPreviewImageView);
}
@Override
protected void onResume() {
super.onResume();
startPlay();
}
@Override
protected void onStop() {
super.onStop();
//在onStop()方法中顯示預覽圖片
mPreviewImageView.setVisibility(View.VISIBLE);
//停止視訊播放
if (mVideoView != null) {
mCurrentPosition = mVideoView.getCurrentPosition();
mVideoView.stopPlayback();
}
}
private void startPlay() {
//設定螢幕常亮
mVideoView.setKeepScreenOn(true);
//設定url
mVideoView.setVideoPath(TEST_VIDEO_URL);
//播放視訊
mVideoView.start();
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
/*
定位到之前播放的位置,但其實定位位置並恰好是mCurrentPosition,
因為視訊有一個關鍵幀的概念,只能seek到關鍵幀的位置,
所以會定位到離mCurrentPosition之前最近的一個關鍵幀。
*/
if (mCurrentPosition != 0) {
mVideoView.seekTo(mCurrentPosition);
}
mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
/* The player just pushed the very first video frame for rendering.
* 視訊第一幀開始渲染,視訊真正開始播放.
* @see android.media.MediaPlayer.OnInfoListener
*/
if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//隱藏預覽圖片,這裡延時100ms消失是防止頁面過渡時閃屏
mPreviewImageView.setVisibility(View.INVISIBLE);
}
}, HIDE_IMAGE_DELAY);
return true;
}
return false;
}
});
}
});
mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//處理視訊播放完成操作
}
});
}
}