zoukankan      html  css  js  c++  java
  • Android基础_多媒体

    一.MediaPlayer

    Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的
    MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的

    二.创建MediaPlayer实例

    1:MediaPlayer mp = new MediaPlayer();
    mp.setDataSource("/sdcard/test.mp3");
    2:MediaPlayer mp = MediaPlayer.create(this, R.raw.test);

    三.MediaPlayer API

    Android通过控制播放器的状态的方式来控制媒体文件的播放

    prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。

    start()是真正启动文件播放的方法, pause()和stop()比较简单,起到暂停和停止播放的作用,
    seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。

    release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。

    reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。

    四.例子,代码

    4.1播放音乐

    public class PlayMusicActivity extends Activity {
    
        private SeekBar sb;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_play_music);
            sb=(SeekBar)findViewById(R.id.sb);
            sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                }
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
    
                }
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                    if(mp!=null)
                        mp.seekTo(seekBar.getProgress());
                }
            });
        }
    
        //播放音乐
        MediaPlayer mp;
        boolean isRun=true;
        public void doPlay(View view){
            if(mp!=null)
                return;
            isRun=true;
            mp=new MediaPlayer();//构建一个播放器对象
            mp.reset();//点击播放重置
            String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/nobody.mp3";//歌曲的路径
            try {
                mp.setDataSource(path);//设置要播放的文件路径
                mp.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置多媒体类型
                mp.prepare();//准备就绪
                sb.setMax(mp.getDuration());//设置进度条最大值为音频文件的持续时间
                mp.start();//开始播放
    
                //更新进度
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while(isRun&&mp.getCurrentPosition()<=sb.getMax()){
                            sb.setProgress(mp.getCurrentPosition());
                            SystemClock.sleep(200);
                        }
                    }
                }).start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public void doPause(View view){
            if(mp==null)
                return;
            if(mp.isPlaying()){
                mp.pause();
                ((Button)view).setText("继续播放");
            }else{
                mp.start();
                ((Button)view).setText("暂停");
            }
        }
    
        public void doStop(View view){
            if(mp!=null&&mp.isPlaying()){
                isRun=false;
                mp.stop();
                mp.release();
                mp=null;
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            doStop(null);
        }
    }

     4.2播放视频

    1.方法一:

    //播放视频一
        public void playVedio_1(View view){
            Intent intent=new Intent(Intent.ACTION_VIEW);
            Uri uri= Uri.parse("file:///sdcard/goodmm.mp4");//更换为你自己的路径
            intent.setDataAndType(uri,"video/mp4");
            startActivity(intent);
        }

     2.方法二:

    //播放视频二
        public void playVedio_2(View view){
            Intent intent=new Intent(this,PlayVideoActivity.class);
            startActivity(intent);
        }
    public class PlayVideoActivity extends Activity {
    
        private VideoView videoView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_play_video);
            videoView=(VideoView)findViewById(R.id.videoView);
            videoView.setMediaController(new MediaController(this));
            Uri uri= Uri.parse("file:///sdcard/goodmm.mp4");
            videoView.setVideoURI(uri);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    SystemClock.sleep(5000);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            videoView.setBackground(null);
                            videoView.start();
                        }
                    });
                }
            }).start();
        }
    }

     3.方法三:

    //播放视频三
        public void playVedio_3(View view){
            Intent intent=new Intent(this,PlayVideo_2Activity.class);
            startActivity(intent);
        }
    public class PlayVideo_2Activity extends Activity {
    
        private MediaPlayer mp;
        private SurfaceView sfView;
        private SurfaceHolder holder;
        private SeekBar sb;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_play_video_2);
    
            sb=(SeekBar)findViewById(R.id.sb);
            sfView=(SurfaceView)findViewById(R.id.sfView);
            holder=sfView.getHolder();
    
            sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                }
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                }
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                    if(mp!=null)
                        mp.seekTo(seekBar.getProgress());
                }
            });
        }
    
        boolean isRun=true;
        public void doPlay(View view){
            if(mp!=null)
                return;
            isRun=true;
            mp=new MediaPlayer();
            mp.reset();
            String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/goodmm.mp4";
            try {
                mp.setDataSource(path);//设置数据源
                mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mp.setDisplay(holder);//设置显示位置
                mp.prepare();
                sb.setMax(mp.getDuration());
                sfView.setBackground(null);
                mp.start();
    
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while (isRun&&mp.getCurrentPosition()<=sb.getMax()){
                            sb.setProgress(mp.getCurrentPosition());
                            SystemClock.sleep(200);
                        }
                    }
                }).start();
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public void doPause(View view){
            if(mp==null)
                return;
            if(mp.isPlaying()){
                mp.pause();
                ((Button)view).setText("继续播放");
            }else{
                mp.start();
                ((Button)view).setText("暂停");
            }
        }
    
        public void doStop(View view){
            if(mp!=null&&mp.isPlaying()){
                isRun=false;
                mp.stop();
                mp.release();
                mp=null;
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            doStop(null);
        }
    
    
    }

     4.3录制

    MediaRecorder:

    Android的MediaRecorder包含了Audio和video的记录功能,在Android的界面上,Music和Video两个应用程序都是调用MediaRecorder实现的。 
    MediaRecorder在底层是基于OpenCore(PacketVideo)的库实现的。

    4.3.1录制音频并播放

    //录制音频
    public
    void recorder_test(View view){ Intent intent=new Intent(this,RecorderActivity.class); startActivity(intent); }
    public class RecorderActivity extends Activity {
    
        private MediaRecorder recorder;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_recorder);
        }
    
        //开始录音
        public void doStart(View view){
            if(recorder!=null)
                return;
            recorder=new MediaRecorder();//构建了一个录音设备
            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置声音来源
            recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置录音文件格式
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//设置声音编码类型
            String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/luyin.3gp";
            recorder.setOutputFile(path);//设置输出文件位置
            try {
                recorder.prepare();//录音设备就绪
                recorder.start();//开始录音
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //录音结束
        public void doStop(View view){
            if(recorder!=null){
                recorder.stop();
                recorder.release();
                recorder=null;
            }
        }
    
        //播放录音
        MediaPlayer mp;
        public void doPlay(View view){
            if(mp!=null)
                return;
            mp=new MediaPlayer();
            mp.reset();
            String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/luyin.3gp";
            try {
                mp.setDataSource(path);
                mp.prepare();
                mp.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            doStop(null);
        }
    }

    4.3.2录制视频并播放

    //录制视频
        public void recorder_video_test(View view){
            Intent intent=new Intent(this,Recorder_VideoActivity.class);
            startActivity(intent);
        }
    public class Recorder_VideoActivity extends Activity {
    
        private MediaPlayer mp;
        private SurfaceView sfView;
        private SurfaceHolder holder;
        private MediaRecorder recorder;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_recorder__video);
            sfView=(SurfaceView)findViewById(R.id.sfView);
            holder=sfView.getHolder();
        }
    
        //开始录像
        public void doStart(View view){
            recorder=new MediaRecorder();
            recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
            recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
            String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/luxiang.mp4";
            recorder.setOutputFile(path);
            recorder.setPreviewDisplay(holder.getSurface());
            try {
                recorder.prepare();
                recorder.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public void doStop(View view){
            if(recorder!=null){
                try{
                    recorder.stop();
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
    
        }
    
        public void doPlay(View view){
            if(mp!=null)
                return;
            mp=new MediaPlayer();
            mp.reset();
            String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/luxiang.mp4";
            try {
                mp.setDataSource(path);//设置数据源
                mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mp.setDisplay(holder);//设置显示位置
                mp.prepare();
                sfView.setBackground(null);
                mp.start();
            }catch (Exception ex){
                ex.printStackTrace();
            }
    
        }
    }
  • 相关阅读:
    将Nginx添加到windows服务中
    springboot使用redis管理session
    GIT常用命令
    阻止360、谷歌浏览器表单自动填充
    谈谈对Spring IOC的理解
    同一个Nginx服务器同一端口配置多个代理服务
    LeetCode 653. Two Sum IV
    109. Convert Sorted List to Binary Search Tree(根据有序链表构造平衡的二叉查找树)
    108. Convert Sorted Array to Binary Search Tree(从有序数组中构造平衡的BST)
    LeetCode 236. Lowest Common Ancestor of a Binary Tree(二叉树求两点LCA)
  • 原文地址:https://www.cnblogs.com/Crezy/p/8086033.html
Copyright © 2011-2022 走看看