MediaRecorder官方文档导读

时间:2024-10-08 17:09:16

无论什么语言,官方文档和源码是最好的资料,一如既往的,先看官方文档,之后看源码。如题,主要看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()方法,这个方法里面总有不同的参数,这个类就是参数的值,这里说一下各个不同值的区别:

  1. default:默认值
  2. AAC:高级音频编码,苹果用的就是这种音频格式,简单说下优缺点:
    • 优点:相对于mp3,AAC格式的音质更佳,文件更小。
    • 不足:AAC属于有损压缩的格式,与时下流行的APE、FLAC等无损格式相比音质存在”本质上”的差距。加之,传输速度更快的USB3.0和16G以上大容量MP3正在加速普及,也使得AAC头上”小巧”的光环不复存在。
  3. HE_AAC:HE-AAC混合了AAC与SBR技术
  4. AAC_ELD: 低延时的AAC音频编解码器
  5. AMR_NB:编码的是无视频纯声音3gp文件就是amr,他的文件比AAC的小,他的音乐效果没ACC的好
  6. AMR_WB:VMR-WB 是新型可变速率多模式宽带语音编解码器,专为无线 CDMA 2000标准而设计,目的在于在 50 至 7000 HZ 的频带上进行语音编码,采样率为 16 KHZ。VMR-WB 基于 3GPP AMR-WB (G722.2) 编解码器,在每秒速率12.65 Kbit 上可实现互操作。
  7. VORBIS:Vorbis是一种新的音频压缩格式,类似于MP3等现有的音乐格式。但有一点不同的是,它是完全免费、开放和没有专利限制的。OGG Vorbis有一个很出众的特点,就是支持多声道,随着它的流行,以后用随身听来听DTS编码的多声道作品将不会是梦想。

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


这个类对应setAudioSource(int)
方法,主要用来设置音频源; 音频参数说明如下:

  1. 设定录音来源于同方向的相机麦克风相同,若相机无内置相机或无法识别,则使用预设的麦克风
  2. 默认音频源
  3. 设定录音来源为主麦克风。
  4. .VOICE_CALL设定录音来源为语音拨出的语音与对方说话的声音
  5. .VOICE_COMMUNICATION 摄像头旁边的麦克风
  6. .VOICE_DOWNLINK 下行声音
  7. .VOICE_RECOGNITION 语音识别
  8. .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)方法,设置视频的来源。

  1. CAMERA: 视频数据来源摄像头
  2. DEFAULT : 系统默认
  3. SURFACE:视频数据来源于Surface

这部分也很简单,根据具体情况设置不同的数据源,不多做讲解。


通过setOutputFormat(int)方法来控制视频输出的格式:同理列举下各个参数的说明:

  1. AAC_ADTS:ADTS的全称是Audio Data Transport Stream。是AAC音频的传输流格式。是AAC的一种非常常见的传输格式,
  2. AMR_NB:编码的是无视频纯声音3gp文件就是amr,他的文件比AAC的小,他的音乐效果没ACC的好
  3. AMR_WB:VMR-WB 是新型可变速率多模式宽带语音编解码器,专为无线 CDMA 2000标准而设计,目的在于在 50 至 7000 HZ 的频带上进行语音编码,采样率为 16 KHZ。VMR-WB 基于 3GPP AMR-WB (G722.2) 编解码器,在每秒速率12.65 Kbit 上可实现互操作。
  4. DEFAULT:默认输出
  5. MPEG_4:这将指定录制的文件为mpeg-4格式,可以保护Audio和Video
  6. RAW_AMR:录制原始文件,这只支持音频录制,同时要求音频编码为AMR_NB
  7. THREE_GPP:录制后文件是一个3gp文件,支持音频和视频录制
  8. 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