[Android N]MediaRecorder系列之初识mediaRecorder

MediaRecorder简介

mediaRecorder是android系统中可以用于录制视频,音频的模块。可以通过java和cpp去调用到相关的api,从而去录制到本地文件里面。如果你有整个android 的源码,甚至可以做定制。让framework通过广播把encode好的数据上报。这样可以做实时流的传送。

mediaRecorder的使用还有一个好处就是兼容性强,从4.3就有这个东西。虽然后面google有出了一个mediaProjection用于录制屏幕内容,但是这个底层框架没有像mediaRecorder这么灵活。

MediaRecorder的使用

mediaRecorder的使用很简单,如下。NDK和java的写法类似,都如下面所示。

这个是录制video的写法:

// 创建保存录制视频的视频文件  
 videoFile = new File(Environment  
     .getExternalStorageDirectory()  
     .getCanonicalFile() + "/testvideo.3gp");  
 // 创建MediaPlayer对象  
 mRecorder = new MediaRecorder();  
 mRecorder.reset();  
 // 设置从麦克风采集声音(或来自录像机的声音AudioSource.CAMCORDER)  
 mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);  
 // 设置从摄像头采集图像  
 mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);  
 // 设置视频文件的输出格式  
 // 必须在设置声音编码格式、图像编码格式之前设置  
 mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);  
 // 设置声音编码的格式  
 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  
 // 设置图像编码的格式  
 mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);  
 mRecorder.setVideoSize(1280, 720);  
 // 每秒 4帧  
 mRecorder.setVideoFrameRate(20);  
 mRecorder.setOutputFile(videoFile.getAbsolutePath());  
 // 指定使用SurfaceView来预览视频  
 mRecorder.setPreviewDisplay(sView.getHolder().getSurface());  //①  
 mRecorder.prepare();  
 // 开始录制  
 mRecorder.start(); 

这个录制audio的写法

   // 创建保存录音的音频文件  
   soundFile = new File(Environment  
         .getExternalStorageDirectory().getCanonicalFile()  
       + "/sound.amr");  
   mRecorder = new MediaRecorder();  
   // 设置录音的声音来源  
   mRecorder.setAudioSource(MediaRecorder  
       .AudioSource.MIC);  
   // 设置录制的声音的输出格式(必须在设置声音编码格式之前设置)  
   mRecorder.setOutputFormat(MediaRecorder  
       .OutputFormat.AMR_NB);  
   // 设置声音编码的格式  
   mRecorder.setAudioEncoder(MediaRecorder  
       .AudioEncoder.AMR_NB);  
   mRecorder.setOutputFile(soundFile.getAbsolutePath());  
   mRecorder.prepare();  
   // 开始录音  
   mRecorder.start();  //① 

但是mediaRecorder有个比较麻烦的地方是,他是的数据回调是写到一个file里面的,而不是一个buffer里面。这样的话,要做实时流的话,需要把socketfile传给他。然后通过socket实时去发送。但是没有上传buffer这种方式,来得灵活。

但是如果是android原厂,有android源码,我们可以做一下定制,修改底层的framework,让底层回报buffer地址上来。

你可能感兴趣的:(android,MediaRecor,android-N,框架,多媒体)