首页 > 代码库 > 录音视频

录音视频

录音需要用到MediaRecorder,先用它录制音频,保存到本地文件;之后用MediaPlayer 传递路径进行播放

 

首先在onCreate中生成保存音频的文件夹 (也要判断有没有sd卡)

        String dir=Environment.getExternalStorageDirectory()+ "/"+getPackageName()+"/Audio";        File file=new File(dir);        if (!file.exists()){            file.mkdirs();        }

 

开始录音    

4 音频来源  

5 输出格式

6 音频编码

7 输出文件

 1     void record() { 2         path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +getPackageName() + "/Audio/" + System.currentTimeMillis() + ".amr"; 3         recorder = new MediaRecorder(); 4         recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 5         recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 6         recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 7         recorder.setOutputFile(path); 8         try { 9             recorder.prepare();10             recorder.start();11         } catch (IOException e) {12             e.printStackTrace();13         }14     }

 

停止录音

    void stoprecord(){        if (recorder!=null){            recorder.stop();            recorder.reset();            recorder.release();            recorder=null;        }    }

 

点击开始录音后,最好把录音按钮设置成不能点击,等结束录音再开启

查看官方文档,发现在api24 也就是 android 7.0 中加入了 暂停和恢复  pause()  resume(),所以以前的版本是没有官方的录制暂停和恢复的,网上有合成文件的方法

 

 

播放音频   setDataSource可以是本地路径 也可以是网络链接

    void play(){        player=new MediaPlayer();        try {            player.setDataSource(path);            player.prepare();            player.start();        } catch (IOException e) {            e.printStackTrace();        }    }

 

停止播放

    void stopplay(){        if (player!=null){            player.stop();            player.release();            player=null;        }    }

 

暂停 用pause()   恢复方法 就是 start() 

 

 

 

视频录制  需要画面来显示  

这里用 SurfaceView

 

首先初始化

1 和10 都是 设置录制视频的分辨率  ,可以只设置一边,此时两边都设置了,最后录制出来的还是 320*240的视频

7 8 设置视频来源 音频来源

9 设置输出格式

11 视频的帧率

12 13 设置视频音频编码

14 很重要 让视频显示到view上

 1         surfaceView.getHolder().setFixedSize(176, 144); 2         surfaceView.getHolder().setKeepScreenOn(true); 3         surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { 4             @Override 5             public void surfaceCreated(SurfaceHolder surfaceHolder) { 6                 recorder = new MediaRecorder(); 7                 recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 8                 recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 9                 recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);10                 recorder.setVideoSize(320, 240);11                 recorder.setVideoFrameRate(5);12                 recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);13                 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);14                 recorder.setPreviewDisplay(surfaceHolder.getSurface());15             }16 17             @Override18             public void surfaceChanged(SurfaceHolder surfaceHolder, int format,int width,int height) {19 20             }21 22             @Override23             public void surfaceDestroyed(SurfaceHolder surfaceHolder) {24                 if (recorder!=null){25                     recorder.release();26                 }27 28             }29         });

 

录制视频

    void record(){        path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +getPackageName() + "/video/" + System.currentTimeMillis() + ".mp4";        recorder.setOutputFile(path);        try {            recorder.prepare();            recorder.start();        } catch (IOException e) {            e.printStackTrace();        }catch (IllegalStateException e) {            e.printStackTrace();        }    }

 

停止录制

    void btn_stoprecord(){        if (recorder!=null){            try {                recorder.setOnErrorListener(null);                recorder.setPreviewDisplay(null);                recorder.stop();                recorder.release();                recorder=null;            }catch (IllegalStateException e){                e.printStackTrace();            }catch (RuntimeException e){                e.printStackTrace();            }        }    }

 

 

播放

    void play(View view){        player = new MediaPlayer();        try {            player.setDataSource(path);            player.setDisplay(surfaceView.getHolder());            player.prepare();            player.start();        } catch (IOException e) {            e.printStackTrace();        }    }

 

其他部分和音频差不多

 

另一种播放视频的方式    VideoView

感觉和webview 差不多

 

给他setVideoPath 就能指定视频地址

然后设置一个 MediaController 就能控制视频播放了

 

录音视频