录音需要用到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 就能控制视频播放了
时间: 2024-10-09 06:39:08