VideoView在播放之前显示视频第一帧

效果图:


实现思路:把VideoView放在RelativeLayout中,写一个ImageView覆盖VideoView,size与VideoView设置的一样,未获取到第一帧时隐藏ImageView,获取到第一帧之后显示ImageView并使用setImageBitmap方法显示第一帧。

OK,思路清楚之后开始实现:

1.xml布局:

<RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <com.shushan.ui.VideoView
                    android:id="@+id/video_view"
                    android:layout_width="match_parent"
                    android:layout_height="198dp"
                    android:layout_marginBottom="14dp"
                    android:layout_marginLeft="12dp"
                    android:layout_marginRight="12dp"
                    android:layout_marginTop="15dp"
                    />

                <ImageView android:id="@+id/iv_first_frame"
                    android:layout_width="match_parent"
                    android:layout_height="198dp"
                    android:layout_marginBottom="14dp"
                    android:layout_marginLeft="12dp"
                    android:layout_marginRight="12dp"
                    android:layout_marginTop="15dp"
                    android:scaleType="fitXY"
                    android:focusable="false"
                    android:clickable="false"
                    android:visibility="gone"
                    />
            </RelativeLayout>

2.获取第一帧图片bitmap,并显示在imageview上:

private void setFirstFrameDrawable(final String url){
        new Thread(new Runnable() {
            @Override
            public void run() {
                MediaMetadataRetriever mmr = new MediaMetadataRetriever();
                Log.d(TAG,"video_url = "+url);
                String loadUrl;
                if(ImageUtils.isAbsoluteUrl(url)){
                    loadUrl = url;
                }else{
                    loadUrl = BuildConfig.imgBaseUrl+url;
                }
                Log.d(TAG,"loadUrl = "+loadUrl);
                mmr.setDataSource(loadUrl,new HashMap<String, String>());
                firstFrame = mmr.getFrameAtTime();
                mHandler.sendEmptyMessage(0);
            }
        }).start();
    }
private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            ivFirstFrame.setVisibility(View.VISIBLE);
            ivFirstFrame.setImageBitmap(firstFrame);
        }
    };

参数url为网络视频路径,本地视频没有试过。

OK,只要两步就可以实现效果了。但是这个方法很吃网速,网速慢的话需要等较长时间,体验并不是很好。

如果有更好的方法欢迎交流。

实际应用过程中遇到问题给我留言,会尽快回复。





猜你喜欢

转载自blog.csdn.net/yonghuming_jesse/article/details/80568086