录音视频

录音需要用到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             @Override
18             public void surfaceChanged(SurfaceHolder surfaceHolder, int format,int width,int height) {
19 
20             }
21 
22             @Override
23             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 就能控制视频播放了

 

posted @ 2016-10-12 17:38  demon9  阅读(643)  评论(0编辑  收藏  举报