MediaRecorder录制视频和录音

一、MediaRecorder作用
1、MediaRecorder可以实现直接录制视频,不能对每一帧数据进行处理。如果对每一帧数据都能进行处理的话,有两种选择:1.MediaCodec 2.FFMpeg_x264/openh264
二、使用到的权限

<user-permission android:name="android.permission.RECORD_AUdio"/>
	<user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
	<user-permission android:name="android.permission.CAMERA"/>
	<user-permission android:name="android.permission.FLASHLIGHT"/>
	<user-permission android:name="android.permission.MOUNT_UNMOUNT_FILRSYSTEMS"/>
	<user-permission android:name="android.hardware.camera"/>
	<user-permission android:name="android.hardware.camera.autofocus"/>

三、录制视频
1、MediaRecorder功能设置(方法/作用)

getAudioSourceMax() 获取音频信号源的最高值。
getMaxAmplitude() 最后调用这个方法采样的时候返回最大振幅的绝对值
getMetrics() 返回当前Mediacorder测量的数据
getSurface() 当使用Surface作为视频源的时候,返回Sufrace对象
pause() 暂停录制
prepare() 准备录制
resume() 恢复录制
release() 释放与此MediaRecorder对象关联的资源
reset() 重新启动mediarecorder到空闲状态
setAudioChannels(int numChannels) 设置录制的音频通道数
setAudioEncoder(int audio_encoder) 设置audio的编码格式
setAudioEncodingBitRate(int bitRate) 设置录制的音频编码比特率
setAudioSamplingRate(int samplingRate) 设置录制的音频采样率
setAudioSource(int audio_source) 设置用于录制的音源
setAuxiliaryOutputFile(String path) 辅助时间的推移视频文件的路径传递
setAuxiliaryOutputFile(FileDescriptor fd) 在文件描述符传递的辅助时间的推移视频
setCamera(Camera c) 设置一个recording的摄像头,此方法在API21被遗弃,被getSurface替代
setCaptureRate(double fps) 设置视频帧的捕获率
setInputSurface(Surface surface) 设置持续的视频数据来源
setMaxDuration(int max_duration_ms) 设置记录会话的最大持续时间(毫秒)
setMaxFileSize(long max_filesize_bytes) 设置记录会话的最大大小(以字节为单位)
setOutputFile(FileDescriptor fd) 传递要写入的文件的文件描述符
setOutputFile(String path) 设置输出文件的路径
setOutputFormat(int output_format) 设置在录制过程中产生的输出文件的格式
setPreviewDisplay(Surface sv) 表面设置显示记录媒体(视频)的预览
setVideoEncoder(int video_encoder) 设置视频编码器,用于录制
setVideoEncodingBitRate(int bitRate) 设置录制的视频编码比特率
setVideoFrameRate(int rate) 设置要捕获的视频帧速率
setVideoSize(int width, int height) 设置要捕获的视频的宽度和高度
setVideoSource(int video_source) 开始捕捉和编码数据到setOutputFile(指定的文件)
setLocation(float latitude, float longitude) 设置并存储在输出文件中的地理数据(经度和纬度)
setProfile(CamcorderProfile profile) 指定CamcorderProfile对象
setOrientationHint(int degrees) 设置输出的视频播放的方向提示
setOnErrorListener(MediaRecorder.OnErrorListener l) 注册一个用于记录录制时出现的错误的监听器
setOnInfoListener(MediaRecorder.OnInfoListener listener) 注册一个用于记录录制时出现的信息事件

2、MediaRecorder内的嵌套类

MediaRecorder.AudioEncoder
MediaRecorder.AudioSource
MediaRecorder.VideoSource
MediaRecorder.OutputFormat

3、MediaRecorder.AudioEncoder
在录音的时候都要调用setAudioEncoder()方法,这个方法里面总有不同的参数,这个类就是参数的值,这里说一下各个不同值的区别:
default: 默认值。
AAC: 高级音频编码,简单说下优缺点:

AAC优点:相对于mp3,AAC格式的音质更佳,文件更小。
AAC不足:AAC属于有损压缩的格式,与时下流行的APE、FLAC等无损格式相比音质存在”本质上”的差距。加之,传输速度更快的USB3.016G以上大容量MP3正在加速普及,也使得AAC头上”小巧”的光环不复存在。

HE_AAC: HE-AAC混合了AAC与SBR技术。
AAC_ELD: 低延时的AAC音频编解码器。
AMR_NB: 编码的是无视频纯声音3gp文件就是amr,他的文件比AAC的小,音乐效果没ACC的好。
AMR_WB: VMR-WB 是新型可变速率多模式宽带语音编解码器,专为无线 CDMA 2000标准而设计,目的在于在 50 至 7000 HZ 的频带上进行语音编码,采样率为 16 KHZ。VMR-WB 基于 3GPP AMR-WB (G722.2) 编解码器,在每秒速率12.65 Kbit 上可实现互操作。
VORBIS: Vorbis是一种新的音频压缩格式,类似于MP3等现有的音乐格式。但有一点不同的是,它是完全免费、开放和没有专利限制的。OGG Vorbis有一个很出众的特点,就是支持多声道,随着它的流行,以后用随身听来听DTS编码的多声道作品将不会是梦想。
4、MediaRecorder.AudioSource
这个类对应setAudioSource(int) 方法,主要用来设置音频源; MediaRecorder.AudioSource音频参数说明如下:
MediaRecorder.AudioSource.CAMCORDER 设定录音来源于同方向的相机麦克风相同,若相机无内置相机或无法识别,则使用预设的麦克风
MediaRecorder.AudioSource.DEFAULT 默认音频源
MediaRecorder.AudioSource.MIC 设定录音来源为主麦克风。
MediaRecorder.AudioSource.VOICE_CALL设定录音来源为语音拨出的语音与对方说话的声音
MediaRecorder.AudioSource.VOICE_COMMUNICATION 摄像头旁边的麦克风
MediaRecorder.AudioSource.VOICE_DOWNLINK 下行声音
MediaRecorder.AudioSource.VOICE_RECOGNITION 语音识别
MediaRecorder.AudioSource.VOICE_UPLINK 上行声音
MediaRecorder.VideoEncoder

通过setVideoEncoder(int)来设置视频编码格式。
default: 默认编码
H263: H.263 多用于视频传输,其优点是压缩后体积小,占用带宽少;
MPEG_4_SP: 码率低代表它无需高码率即可有很好的视频效果,H264就更好了
H264 也是用于网络视频传输,优点也和H263差不多;再是H264会比前两者更优秀一点,不过一般用在标清或者高清压缩比较多。
VP8: 据说比H264优秀。
HEVC: 一种新的视频压缩标准。可以替代H.264/ AVC编码标准。它将在H.264标准2至4倍的复杂度基础上,将压缩效率提升一倍以上。
5、MediaRecorder.VideoSource
通过setVideoSource(int)方法,设置视频的来源。
CAMERA: 视频数据来源摄像头
DEFAULT: 系统默认
SURFACE: 视频数据来源于Surface
6、MediaRecorder.OutputFormat
通过setOutputFormat(int)方法来控制视频输出的格式:同理列举下各个参数的说明:
AAC_ADTS: ADTS的全称是Audio Data Transport Stream。是AAC音频的传输流格式。是AAC的一种非常常见的传输格式,
AMR_NB: 编码的是无视频纯声音3gp文件就是amr,他的文件比AAC的小,他的音乐效果没ACC的好
AMR_WB: VMR-WB 是新型可变速率多模式宽带语音编解码器,专为无线 CDMA 2000标准而设计,目的在于在 50 至 7000 HZ 的频带上进行语音编码,采样率为 16 KHZ。VMR-WB 基于 3GPP AMR-WB (G722.2) 编解码器,在每秒速率12.65 Kbit 上可实现互操作。
DEFAULT: 默认输出
MPEG_4: 这将指定录制的文件为mpeg-4格式,可以保护Audio和Video
RAW_AMR: 录制原始文件,这只支持音频录制,同时要求音频编码为AMR_NB
THREE_GPP: 录制后文件是一个3gp文件,支持音频和视频录制
WEBM: 编码为VP8/VORBIS的输出格式。
输出格式,大同小异,这里也没有做特别详细的讲解,将一下基本用法就可以了。一般情况下使用输出格式为MPEG_4的即可。
上述主要介绍了MediaRecorder的方法,作用以及部分参数的定义,下面进行MediaRecorder与SurfaceView结合使用并进行录制视频,视频格式为mp4。
7、录制视频实例

/**
     * 开始录制视频
     */
    public void startRecordVideo(){

        if(mCamera == null){
            Log.e(TAG,"Camera为null");
            return;
        }

        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
        mCamera.setParameters(parameters);
        mCamera.startPreview();

        if (mMediaRecorder == null){
            mMediaRecorder = new MediaRecorder();
        }else {
            mMediaRecorder.reset();
        }

        try {

            /*1.解锁相机,为MediaRecorder设置相机*/
            mCamera.unlock();
            mMediaRecorder.setCamera(mCamera);

            /*2.设置音频源和视频源*/
            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

            /*3.CamcorderProfile.QUALITY_HIGH:质量等级对应于最高可用分辨率*/
            mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_720P));

            /*设置视频的输出格式*/
//            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

            /*设置音频的编码格式*/
//            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

            /*设置视频的编码格式*/
//            mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

            /*设置要捕获的视频的帧速率*/
//            mMediaRecorder.setVideoFrameRate(30);

            /*设置编码比特率*/
//            mMediaRecorder.setVideoEncodingBitRate( 5 * 1024 * 1024);

//            mMediaRecorder.setVideoSize(720,1280);

            /*4.设置输出文件*/
            String dirPath = Environment.getExternalStorageDirectory()+"/DCIM/Camera/";
            File dirFile = new File(dirPath);
            if (!dirFile.exists()) dirFile.mkdirs();
            mVideoFilePath = dirPath +"VIDEO_"+ System.currentTimeMillis()+".mp4";
            mMediaRecorder.setOutputFile(mVideoFilePath);

            /*摄像头默认是横屏,这是拍摄的视频旋转90度*/
            mMediaRecorder.setOrientationHint(90);

            /*5.设置预览输出*/
            mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());

            /*6.准备配置*/
            mMediaRecorder.prepare();

            /*7.开始录制*/
            mMediaRecorder.start();


        }catch (Exception e){
            e.printStackTrace();
        }
    }

四、直接设置录制视频的质量

mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_720P));

五、视频质量的分辨率:CamcorderProfile.java

  * Quality level corresponding to the 720p (1280 x 720) resolution.
     */
    public static final int QUALITY_720P = 5;

    /**
     * Quality level corresponding to the 1080p (1920 x 1080) resolution.
     * Note that the vertical resolution for 1080p can also be 1088,
     * instead of 1080 (used by some vendors to avoid cropping during
     * video playback).
     */
    public static final int QUALITY_1080P = 6;

六、视频停止录制

/**
     * 结束录制
     */
    public void stopRecordVideo(){
        if (mMediaRecorder != null){
           mediaRecorder.setOnErrorListener(null);
            mediaRecorder.setOnInfoListener(null);
            mediaRecorder.setPreviewDisplay(null);
            // 停止录制
            mediaRecorder.stop();
            mediaRecorder.reset();
            // 释放资源
            mediaRecorder.release();
            mediaRecorder = null;
            getContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,Uri.parse(mVideoFilePath)));
            Toast.makeText(getContext(),"视频保存在:"+mVideoFilePath,Toast.LENGTH_SHORT).show();
        }
    }

你可能感兴趣的:(Camera)