一,视频录制MediaRecorder类调用参数详解

时间:2024-10-08 17:18:44

一. 类概述:

用于录制音频和视频的一个类。

二. 状态图如下:

在这里插入图片描述

MediaRecorder的各个状态的介绍:

Initial:

初始状态,当使用new()方法创建一个MediaRecorder对象或者调用了

reset()方法时

该MediaRecorder对象处于Initial状态。在设定视频源或者音频源之后将转换为Initialized状态。另

外,在除Released状态外的其它状态通过调用reset()方法都可以使MediaRecorder进入该状态。

Initialized:

已初始化状态,可以通过在Initial状态调用setAudioSource()或setVideoSource()方法进入该状态。在这个状态可以通过setOutputFormat()方法设置输出格式,此时MediaRecorder转换为DataSourceConfigured状态。另外,通过reset()方法进入Initial状态。

DataSourceConfigured:

数据源配置状态,这期间可以设定编码方式、输出文件、屏幕旋转、预览显示等等。可以在Initialized状态通过setOutputFormat()方法进入该状态。另外,可以通过reset()方法回到Initial状态,或者通过prepare()方法到达Prepared状态。

Prepared:

就绪状态,在DataSourceConfigured状态通过prepare()方法进入该状态。在这个状态可以通过start()进入录制状态。另外,可以通过reset()方法回到Initialized状态。

Recording:

录制状态,可以在Prepared状态通过调用start()方法进入该状态。另外,它可以通过stop()方法或reset()方法回到Initial状态。

Released:

释放状态(官方文档给出的词叫做Idle state 空闲状态),可以通过调用release()方法来进入这个状态,这时将会释放所有和MediaRecorder对象绑定的资源。

Error:

错误状态,当错误发生的时候进入这个状态,它可以通过reset()方法进入Initial状态。

**特别说明:**使用MediaRecorder录音录像时需要严格遵守状态图说明中的函数调用先后顺序,在不同的状态调用不同的函数,否则会出现异常。

三. 具体方法讲解如下:

(1)setInputSurface(Surface surface)

MediaRecorder 设置surface流,这个Surface 必需使用MediaCodec进行创建,创建的时机是在MediaRecorder实例创建之后进行创建。最后在创建成功之后设置给MediaRecorder.

		Surface mRecorderSurface;
		MediaRecorder mMediaRecorder;
		if (mMediaRecorder == null) {
			mMediaRecorder = new MediaRecorder();
           mRecorderSurface =();
         } else {
            // 重置到初始状态
            ();
           }
		 (mRecorderSurface);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

重新设置MediaRecorder的surface 的目的是我们在相机创建session 时将这个surface设置给底层sensor,使其画面绘制到我们创建的surface上,这样我们在操作开始录制,和停止录制时,操作的画面是我们传入的surface, 避免了我们开始录制和停止录制出现预览卡顿现象, 其次录制的surface只创建一次节省资源。

        try {
            List<Surface> outputs = setVideoOutputSize((), mRecorderSurface);
                (outputs, sessionStateCb, mBackgroundHandler);
        } catch (CameraAccessException | IllegalStateException e) {
            ();
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
(2)setAudioSource(int audioSource)

设置音频源,其取值如下:

 //设定录音来源为麦克风 (较常用设置)
 //设定录音来源与同方向的相机麦克风相同,若相机无内置相机或无法设定时,则使用预设的麦克风
 // 默认音频源
.VOICE_CALL//设定录音来源为语音拨出的语音与对方说话的声音
.VOICE_COMMUNICATION //摄像头旁边的麦克风

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
(3) setVideoSource(int audioSource)

设置视频源,其取值如下:

 默认状态
 ,意思是从Surface里面读取画面去录制。(较常用设置)
 ,视频源来自于摄像头,也就是我们不单独设置surface的情况下使用
  • 1
  • 2
  • 3
(4) setOutputFormat(int output_format)

用于设置输出格式
类中定义了setoutputFormat()方法的形参需要传入的一些常量值,这些值代表含义如下图:

在这里插入图片描述

//MPEG_4 是最常用的,因为输出常用格式:mp4,m4a;
(.MPEG_4);
  • 1
  • 2
(5) setOutputFile(String path)

设置录制的音频文件的保存位置。

(6) setAudioEncoder(int audio_encoder)

设置所录制的声音的编码格式

在类中定义了调用常量如下:

(1)default:默认值

(2)AAC:高级音频编码,苹果用的就是这种音频格式,简单说下优缺点:优点:相对于mp3,AAC格式的音质更佳,文件更小。不足:AAC属于有损压缩 的格式,与时下流行的APE、FLAC等无损格式相比音质存在”本质上”的差距。加之,传输速度更快的USB3.0和16G 以上大容量MP3正在加速普 及,也使 得AAC头上”小巧”的光环不复存在。
支持的容器格式(几乎支持所有输出格式)3GPP ,3gp,MPEG-4,mp4,m4a,ts (not seekable,Android 3.0+),aac
(3)HE_AAC:HE-AAC混合了AAC与SBR技术

(4)AAC_ELD: 低延时的AAC音频编解码器

(5)AMR_NB:编码的是无视频纯声音3gp文件就是amr,他的文件比AAC的小,他的音乐效果没ACC的好
支持的文件类型/容器格式 .3GPP.3gp

(6)AMR_WB:VMR-WB 是新型可变速率多模式宽带语音编解码器,专为无线 CDMA 2000标准而设计,目的在于在 50 至 7000 HZ 的频带上进行语音 编码,采样率为 16 KHZ。VMR-WB 基于 3GPP AMR-WB (G722.2) 编解码器,在每秒速率12.65 Kbit 上可实现互操作。
支持的文件类型/容器格式 .3GPP.3gp

总结:开发首选AAC就行了,如果录音被抢占了释放掉或者选default就不会出现这种问题。

(7) setVideoEncoder(int audio_encoder)

设置视频编码格式

在类中定义了调用常量如下:

(1) default:默认编码
(2) H263:H263 多用于视频传输,其优点是压缩后体积小,占用带宽少;
(3) MPEG_4_SP:码率低代表它无需高码率即可有很好的视频效果,H264就更好了
(4) H264,也是用于网络视频传输,优点也和H263差不多;再是H264会比前两者更优秀一点,不过一般用在标清或者高清压缩比较 多。
(5) VP8: 据说比H264优秀。
(6)HEVC:一种新的视频压缩标准。可以替代H.264/ AVC编码标准。它将在H.264标准2至4倍的复杂度基础上,将压缩效率提升一倍以上。

(8)setVideoFrameRate(int rate)

设置要捕获的视频的帧速率。每秒要捕捉的视频帧数.必须在setVideoSource()后调用。在setOutputFormat()之后,在prepare()之前调用它

帧率或者称FPS(Frames Per Second,帧/秒),是指每秒显示的图片数,或者GPU处理时每秒能够更新的次数。越高的帧速率可以得到更流畅逼真的画面。每秒钟帧数越多,所显示的动作就会越流畅。帧率也会影响体积,帧率越高,每秒钟显示的画面越多,体积就越大。由于人类眼睛的特殊生理结构,如果画面帧率高于16,就会认为是连贯的,此现象称之为视觉暂留。并且当帧速达到一定数值后,再增长的话,人眼能感知的流畅度的提升就比较有限了。一般来说30fps是可以接受的,将性能提升至60fps则可以明显提升交互感和逼真感,如果超过75fps一般就不容易察觉到有明显的流畅度提升了。如果帧率超过屏幕刷新率只会浪费图形处理的能力。

其次设置的帧率不是恒定不变的,其受到环境亮度变化有所改变

(9)setCaptureRate(int rate)

设置要捕获的视频的帧速率 ,在延时情况下使用。setVideoFrameRate在正常记录情况下使用

(10)setAudioSamplingRate(int samplingRate)

常用的采样率有:
8,000 Hz - 电话所用采样率,对于人的说话已经足够
11,025 Hz
22,050 Hz - 无线电广播所用采样率
32,000 Hz - miniDV数码视频camcorder、DAT(LP mode)所用采样率
44,100 Hz - 音频CD,也常用于MPEG-1音频(VCD, SVCD, MP3)所用采样率
47,250 Hz - Nippon Columbia(Denon)开发的世界上第一个商用PCM录音机所用采样率
48,000 Hz - miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率
50,000 Hz - 二十世纪七十年代后期出现的3M和Soundstream开发的第一款商用数字录音机所用采样率
50,400 Hz - 三菱X-80数字录音机所用所用采样率
96,000或者192,000 Hz - DVD-Audio、一些LPCM DVD音轨、Blu-ray Disc(藍光碟)音轨、和HD-DVD(高清晰度DVD)音轨所用所用采样率
2.8224 MHz - SACD、索尼和飞利浦联合开发的称为Direct Stream Digital的1位sigma-delta modulation过程所用采样率。

常用
AAC音频编码标准支持的采样率范围在8 ~ 96khz范围内,
AMRNB支持的采样率为8kHz
AMRWB支持的速率为16kHz

(11) setVideoEncodingBitRate(int bitRate)

视频比特率:指每秒传输速率(比特数(bit)。单位为bps(Bit Per Second),比特率越高,每秒传送数据就越多,画质就越清晰。

可以说使用MediaRecorder的setVideoEncodingBitrate方法设置视频编码比特率,并传入请求的比特率,以位/秒为单位。视频的低比特率设置在256000位/秒(256kbps)范围之内,而高比特率视频在3000000位/秒(3 m kbps)范围之内。

#####(12) setAudioEncodingBitRate(int bitRate)

音频比特率:指将模拟声音信号转换成数字声音信号后,单位时间内的二进制数据量,是间接衡量音频质量的一个指标

作为参考,每秒8,000位(8 kbps)的比特率非常低,适用于需要通过慢速网络实时传输的音频,而每秒196,000位(196 kbps)或更高的速率并不罕见。 MP3文件中的音乐。当前,大多数Android设备仅在频谱的低端支持比特率,如果您选择的比特率太高,MediaRecorder会自动在其可支持的范围内选择一种比特率。
(8000);

四.其他方法如下:
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( l)	注册一个用于记录录制时出现的错误的监听器
setOnInfoListener( listener)	注册一个用于记录录制时出现的信息事件

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

[Android][MediaRecorder] Android MediaRecorder框架简洁梳理