rokevin
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
  • 视频播放

视频播放

推荐几款比较好Android视频播放器

https://blog.csdn.net/MINGZHNGLEI/article/details/80153125

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


// 网络url
private void setFirstFrameDrawable(final String url){
    new Thread(new Runnable() {
        @Override
        public void run() {
            MediaMetadata mmr = new MediaMetadataRetriever();
            mmr.setDataSource(loadUrl,new HashMap<String, String>());
            firstFrame = mmr.getFrameAtTime();
            mHandler.sendEmptyMessage(0);
        }
    }).start();
}

// 本地path绝对路径
private void setFirstFrameDrawable(final String path){
    new Thread(new Runnable() {
        @Override
        public void run() {
            MediaMetadata mmr = new MediaMetadataRetriever();
            mmr.setDataSource(path);
            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);
    }   
};

使用VideoView播放本地视频

典型的问题有: 1、视频比例和屏幕比例不一致的话,默认不能全屏。

代码示例

public class VideoShowActivity extends AppCompatActivity {

    private VideoView mVideoView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video_show);

        mVideoView = findViewById(R.id.video_view);
        setupVideo();
    }

    private void setupVideo() {
        mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mVideoView.start();
            }
        });
        mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                stopPlaybackVideo();
            }
        });
        mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                stopPlaybackVideo();
                return true;
            }
        });

        try {
            Uri uri = Uri.parse("android.resource://" + getPackageName() + "/raw/" + R.raw.test_video);
            mVideoView.setVideoURI(uri);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (!mVideoView.isPlaying()) {
            mVideoView.resume();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mVideoView.canPause()) {
            mVideoView.pause();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        stopPlaybackVideo();
    }

    private void stopPlaybackVideo() {
        try {
            mVideoView.stopPlayback();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/video_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:orientation="vertical">

    <VideoView
        android:id="@+id/video_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

https://yq.aliyun.com/articles/303947

最近更新:: 2025/10/22 15:36
Contributors: luokaiwen