无论什么语言,官方文档和源码是最好的资料,一如既往的,先看官方文档,之后看源码。如题,主要看MediaRecorder。还是翻译和自己理解的方式呈现,如果有不对之处,还望指出。
-
MediaRecorder
-
嵌套类
- MediaRecorderAudioEncoder
- MediaRecorderAudioSource
- MediaRecorderVideoEncoder
- MediaRecorderVideoSource
- MediaRecorderOutputFormat
- 方法
- 案例
-
嵌套类
MediaRecorder
这个类主要用来做多媒体录音和录视频的
MeidaRecord的运行流程图如下:
A common case of using MediaRecorder to record audio works as follows:
使用MediaRecorder录音的步骤如下:
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(PATH_NAME);
recorder.prepare();
recorder.start(); // Recording is now started
...
recorder.stop();
recorder.reset(); // You can reuse the object by going back to setAudioSource() step
recorder.release(); // Now the object cannot be reused
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
可以通过setOnInfoListener(OnInfoListener)或者setErrorListener(OnErrorListener)来获取各自回调的信息监听。
语法:
嵌套类
大家都知道在录音的时候都要调用setAudioEncoder()方法,这个方法里面总有不同的参数,这个类就是参数的值,这里说一下各个不同值的区别:
- default:默认值
- AAC:高级音频编码,苹果用的就是这种音频格式,简单说下优缺点:
- 优点:相对于mp3,AAC格式的音质更佳,文件更小。
- 不足:AAC属于有损压缩的格式,与时下流行的APE、FLAC等无损格式相比音质存在”本质上”的差距。加之,传输速度更快的USB3.0和16G以上大容量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编码的多声道作品将不会是梦想。
总结:开发首选AAC就行了,如果录音被抢占了释放掉或者选default就不会出现这种问题。
这个类对应setAudioSource(int)
方法,主要用来设置音频源; 音频参数说明如下:
- 设定录音来源于同方向的相机麦克风相同,若相机无内置相机或无法识别,则使用预设的麦克风
- 默认音频源
- 设定录音来源为主麦克风。
- .VOICE_CALL设定录音来源为语音拨出的语音与对方说话的声音
- .VOICE_COMMUNICATION 摄像头旁边的麦克风
- .VOICE_DOWNLINK 下行声音
- .VOICE_RECOGNITION 语音识别
- .VOICE_UPLINK 上行声音
通过setVideoEncoder(int)来设置视频编码格式。
1. default:默认编码
2. H263:H.263 多用于视频传输,其优点是压缩后体积小,占用带宽少;
3. MPEG_4_SP:码率低代表它无需高码率即可有很好的视频效果,H264就更好了
4. . H264,也是用于网络视频传输,优点也和H263差不多;再是H264会比前两者更优秀一点,不过一般用在标清或者高清压缩比较多。
5. VP8: 据说比H264优秀。
6. HEVC:一种新的视频压缩标准。可以替代H.264/ AVC编码标准。它将在H.264标准2至4倍的复杂度基础上,将压缩效率提升一倍以上。
当然这一部分稍微了解就行,这里大部分注解都是参考网上的,毕竟不是专门做音视频这一块的,所以没有深入研究,知道什么情况下具体用哪一个就行了。纯属个人浅见。
通过setVideoSource(int)方法,设置视频的来源。
- CAMERA: 视频数据来源摄像头
- DEFAULT : 系统默认
- SURFACE:视频数据来源于Surface
这部分也很简单,根据具体情况设置不同的数据源,不多做讲解。
通过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的即可。
方法:
方法 | 作用 |
---|---|
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) | 注册一个用于记录录制时出现的信息事件 |
案例:
源码地址:CameraVideoRecord