MediaRecorder官方文档导读

无论什么语言,官方文档和源码是最好的资料,一如既往的,先看官方文档,之后看源码。如题,主要看MediaRecorder。还是翻译和自己理解的方式呈现,如果有不对之处,还望指出。

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

可以通过setOnInfoListener(OnInfoListener)或者setErrorListener(OnErrorListener)来获取各自回调的信息监听。

语法:

嵌套类

MediaRecorder.AudioEncoder

大家都知道在录音的时候都要调用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就不会出现这种问题。


MediaRecorder.AudioSource

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

  1. MediaRecorder.AudioSource.CAMCORDER 设定录音来源于同方向的相机麦克风相同,若相机无内置相机或无法识别,则使用预设的麦克风
  2. MediaRecorder.AudioSource.DEFAULT 默认音频源
  3. MediaRecorder.AudioSource.MIC 设定录音来源为主麦克风。
  4. MediaRecorder.AudioSource.VOICE_CALL设定录音来源为语音拨出的语音与对方说话的声音
  5. MediaRecorder.AudioSource.VOICE_COMMUNICATION 摄像头旁边的麦克风
  6. MediaRecorder.AudioSource.VOICE_DOWNLINK 下行声音
  7. MediaRecorder.AudioSource.VOICE_RECOGNITION 语音识别
  8. MediaRecorder.AudioSource.VOICE_UPLINK 上行声音

MediaRecorder.VideoEncoder

通过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倍的复杂度基础上,将压缩效率提升一倍以上。

当然这一部分稍微了解就行,这里大部分注解都是参考网上的,毕竟不是专门做音视频这一块的,所以没有深入研究,知道什么情况下具体用哪一个就行了。纯属个人浅见。


MediaRecorder.VideoSource

通过setVideoSource(int)方法,设置视频的来源。

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

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


MediaRecorder.OutputFormat

通过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(MediaRecorder.OnErrorListener l) 注册一个用于记录录制时出现的错误的监听器
setOnInfoListener(MediaRecorder.OnInfoListener listener) 注册一个用于记录录制时出现的信息事件

案例:

源码地址:CameraVideoRecord

发布了50 篇原创文章 · 获赞 166 · 访问量 51万+
展开阅读全文

在android中同时调用多个麦克风报错:android.media.MediaRecorder.start(Native Method)

05-15

1.问题描述:<br>在android中同时调用多个麦克风报错: <br>报错位置mr2.strat():第二个麦克风启动操作时报错。<br> 报错内容:<br> **android.media.MediaRecorder.start(Native Method)**<br> 代码如下: ![图片说明](https://img-ask.csdn.net/upload/201905/15/1557913924_439814.png) <br> <br> <br> ![图片说明](https://img-ask.csdn.net/upload/201905/15/1557914045_94388.png) 录音权限和存储权限已授予。 <br> <br> ``` private void startRecord(){ if(mr == null){ File dir = new File(Environment.getExternalStorageDirectory(),"sounds"); if(!dir.exists()){ dir.mkdirs(); } String filename = string1.getText().toString(); SimpleDateFormat df = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");//设置日期格式 File soundFile = new File(dir,filename+df.format(new Date())+"_MIC"+".amr"); File soundFile2 = new File(dir,filename+df.format(new Date())+"_VOICE_COMMUNICATION"+".amr"); if(!soundFile.exists()){ try { soundFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } if(!soundFile2.exists()){ try { soundFile2.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } mr = new MediaRecorder(); mr.setAudioSource(MediaRecorder.AudioSource.DEFAULT); mr.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB); //设置输出格式 mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB); //设置编码格式 mr.setOutputFile(soundFile.getAbsolutePath()); mr2 = new MediaRecorder(); mr2.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION); //音频输入源 mr2.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB); mr2.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB); mr2.setOutputFile(soundFile2.getAbsolutePath()); try { mr.prepare(); mr.start();// mr2.prepare(); mr2.start();//**在这个位置报错** } catch (IOException e) { e.printStackTrace(); } } } //停止录制,资源释放 private void stopRecord(){ if(mr != null){ mr.stop(); mr2.stop(); mr.release(); mr2.release(); mr = null; mr2 = null; } } ``` 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览