AndroidMedia26 安卓媒体 使用 MediaPlayer 和 SurfaceView 实现自定义复杂播放器

概述资源准备:把视频资源放到sd卡中代码位置:同志们请忽略这一点,放出位置是为了方便我自己回头看项目源码视图代码:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apkes/android"xmlns:app="http://schemas.android 资源准备:把视频资源放到sd卡中

代码位置:同志们请忽略这一点,放出位置是为了方便我自己回头看项目源码

视图代码:
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    xmlns:app="http://schemas.androID.com/apk/res-auto"    xmlns:tools="http://schemas.androID.com/tools"    androID:orIEntation="vertical"    androID:layout_wIDth="match_parent"    androID:layout_height="match_parent"    tools:context=".SurfaceVIEwActivity">    <SurfaceVIEw        androID:layout_wIDth="match_parent"        androID:layout_height="300dp"        androID:ID="@+ID/suf" />    <Seekbar        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:layout_marginRight="10dp"        androID:layout_marginleft="10dp"        androID:ID="@+ID/seek_suf" />    <button        androID:layout_wIDth="wrap_content"        androID:layout_height="wrap_content"        androID:text="播放"        androID:ID="@+ID/btn_suf"        androID:layout_gravity="center" /></linearLayout>
java代码:
package com.example.androIDmedia26;import androIDx.annotation.NonNull;import androIDx.appcompat.app.AppCompatActivity;import androID.media.AudioManager;import androID.media.MediaPlayer;import androID.os.Bundle;import androID.os.Environment;import androID.os.Handler;import androID.os.Message;import androID.vIEw.SurfaceHolder;import androID.vIEw.SurfaceVIEw;import androID.vIEw.VIEw;import androID.Widget.button;import androID.Widget.Seekbar;import java.io.file;import java.io.IOException;public class SurfaceVIEwActivity extends AppCompatActivity implements VIEw.OnClickListener, Seekbar.OnSeekbarchangelistener, SurfaceHolder.Callback {//    创建一个表面支架,相当于显示器    private SurfaceVIEw suf;    private button btn_suf;//    创建一个进度条    private Seekbar seek_suf;//    创建媒体播放器,相当于控制器,对音视频的所有 *** 作都由它来控制    private MediaPlayer mediaPlayer;//    定义一个处理程序来控制进度条读秒走动    private Handler handler = new Handler() {        @OverrIDe        public voID handleMessage(@NonNull Message msg) {            super.handleMessage(msg);//            获取视频当前播放位置            int process = mediaPlayer.getCurrentposition();//            设置进度条位置            seek_suf.setProgress(process);//            再次调用发送空消息的延迟方法,设置下一秒的进度条位置            handler.sendEmptyMessageDelayed(0, 1000);        }    };    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_sufactivity);        btn_suf = findVIEwByID(R.ID.btn_suf);        seek_suf = findVIEwByID(R.ID.seek_suf);        suf = findVIEwByID(R.ID.suf);        btn_suf.setonClickListener(this);        seek_suf.setonSeekbarchangelistener(this);//        启用或禁用选项以在显示此表面时保持屏幕开启。 默认值为 false,允许它关闭。 从任何线程调用都是安全的        suf.getHolder().setKeepScreenOn(true);//        为这个持有者添加一个回调接口。 一个持有者可以有多个回调接口。        suf.getHolder().addCallback(this);    }    @OverrIDe    public voID onClick(VIEw v) {//        监听播放按钮的点击事件        if (v.getID() == R.ID.btn_suf) {            if (btn_suf.getText().equals("播放")) {                btn_suf.setText("暂停");//                如果视频不为空,且未处于播放状态                if (mediaPlayer != null && !mediaPlayer.isPlaying()) {//                    调用发送空消息的延迟方法,让进度条开始读秒                    handler.sendEmptyMessageDelayed(0, 1000);//                    视频开始播放                    mediaPlayer.start();                }            } else {                btn_suf.setText("播放");//                如果视频不为空,且处于播放状态                if (mediaPlayer != null && mediaPlayer.isPlaying()) {//                    让进度条停止读秒                    handler.removeMessages(0);//                    视频暂停                    mediaPlayer.pause();                }            }        }    }    @OverrIDe    public voID onProgressChanged(Seekbar seekbar, int progress, boolean fromUser) {    }    @OverrIDe    public voID onStartTrackingtouch(Seekbar seekbar) {    }//    当停止拖动进度条时    @OverrIDe    public voID onStopTrackingtouch(Seekbar seekbar) {//        获取进度条当前位置        int process=seekbar.getProgress();//        让视频跳转到进度条位置        mediaPlayer.seekTo(process);//        开始播放        mediaPlayer.start();    }//    这在首次创建表面后立即调用    @OverrIDe    public voID surfaceCreated(@NonNull SurfaceHolder holder) {//        创建媒体控件        mediaPlayer = new MediaPlayer();//        获取要播放的文件        file file = new file(Environment.getExternalStorageDirectory() + "/dmx.mp4");        try {//            把文件绝对路径给到媒体控件            mediaPlayer.setDataSource(file.getabsolutePath());//            指定要 *** 作的文件的流类型//            指定类型里没有单独的视频类型,音视频类型都使用STREAM_MUSIC            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//            绑定mediaPlayer到surfaceVIEw,mediaPlayer相当于控制器,surfaceVIEw相当于显示器            mediaPlayer.setdisplay(suf.getHolder());//            就绪媒体控件,这个方法会阻塞程序,直到mediaPlayer做好播放准备            mediaPlayer.prepare();//            设置进度条最大值为视频的时长            seek_suf.setMax(mediaPlayer.getDuration());        } catch (IOException e) {            e.printstacktrace();        }    }    @OverrIDe    public voID surfaceChanged(@NonNull SurfaceHolder holder, int format, int wIDth, int height) {    }//    这在表面被破坏之前立即调用    @OverrIDe    public voID surfaceDestroyed(@NonNull SurfaceHolder holder) {//        当媒体不为空,且媒体正在播放        if (mediaPlayer != null && mediaPlayer.isPlaying()) {//            停止播放            mediaPlayer.stop();//            进度条停止            handler.removeMessages(0);//            释放媒体            mediaPlayer.release();//            媒体置空            mediaPlayer = null;        }    }}
效果:

总结

以上是内存溢出为你收集整理的AndroidMedia26 安卓媒体 使用 MediaPlayer 和 SurfaceView 实现自定义复杂播放器全部内容,希望文章能够帮你解决AndroidMedia26 安卓媒体 使用 MediaPlayer 和 SurfaceView 实现自定义复杂播放器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/999700.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-21
下一篇2022-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存