1. 程式人生 > >VideoView播放視訊黑屏問題處理

VideoView播放視訊黑屏問題處理

前言

你又擦肩而過
你耳機聽什麼
能不能告訴我
…….
記得 我寫給你的情書
都什麼年代了
到現在我還在寫著
總有一天總有一年會發現
有人默默的陪在你的身邊
也許 我不該在你的世界
當你收到情書
也代表我已經走遠

簡介

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) { //處理視訊播放完成操作 } }); } }

原始碼下載