多媒体应用开发 - 录制音频

录制音频

1、AndroidMediaRecorder架构详解

在android中录制音频有两种方式,MediaRecorder和AudioRecord。两者的区别如下:

(1) MediaRecorder

录制的音频文件是经过压缩后的,需要设置编码器,并且录制的音频文件可以用系统自带的Music播放器播放。MediaRecorder已经集成了录音、编码、压缩等,并支持少量的录音音频格式,但是这也是他的缺点,支持的格式过少并且无法实时处理音频数据。

(2) AudioRecorder

主要实现对音频实时处理以及边录边播功能,相对MediaRecorder比较专业,在声音录制过程中,可以处理采集的声音数据,如降噪、合成等。过程为一段一段进行录制然后得到数据分别进行处理。录制的是PCM格式的音频文件,如果保存成音频文件,是不能够被播放器播放的,需要用AudioTrack来播放,所以必须先写代码实现数据编码以及压缩。

2、MediaRecorder状态图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eetZVJVX-1598595416228)(E:\StudyNotes\TyporaNotes\移动终端高级开发####图片\wps4.png)]

⭐️ 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 空闲状态),可以通过在Initial状态调用release()方法来进入这个状态,这时将会释放所有和MediaRecorder对象绑定的资源。

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

3、 使用MediaRecorder类录制视频基本步骤如下:

3.1.调用new MediaRecorder()创建MediaRecorder对象。
3.2 调用MediaRecorder对象的setAudioSource()方法设置声音来源,

一般需要传入MediaRecorder. AudioSource.MIC参数指定录制来自麦克风的声音。因为在录制视频时不仅需要采集声音,还需要采集图像,所以在调用setAudioSource()方法时还需要调用setVideoSource()方法来设置图像来源。

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.VideoSource

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

⭐️ CAMERA: 视频数据来源摄像头

⭐️ DEFAULT : 系统默认

⭐️ SURFACE:视频数据来源于Surface

3.3. 调用MediaRecorder对象的setOutputFormat()方法设置输出文件的格式。

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的输出格式。

3.4. 设置所录制的音频和视频的编码格式、编码位率等
  • setAudioEncodingBitRate(int bitRate):设置声音的编码位率

  • setAudioSamplingRate(int samplingRate):设置声音的采样率

  • setVideoEncodingBitRate (int bitRate):设置视频的编码位率

  • setVideoFrameRate(int rate):设置视频的帧速率

  • setVideoSize(int width, int height):设置视频的宽度和高度

MediaRecorder.AudioEncoder

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

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

注意:在执行上述步骤的时候,必须在设置视频文件的输出格式之后再设置音频和视频的编码格式,否则程序将会抛出异常。

3.5 调用MediaRecorder对象的setOutputFile(String path)方法设置所录制视频文件的保存位置。
3.6 调用MediaRecorder对象的setPreviewDisplay(Surface sv)方法设置使用哪个SurfaceView来显示视频预览。
3.7 调用MediaRecorder对象的prepare()方法准备录制视频。
3.8. 调用MediaRecorder对象的start()方法开始录制视频。
3.9 录制完成,调用MediaRecorder对象的stop()方法停止录制,并调用release()方法释放资源。

在录制视频的时候需要使用麦克风录制声音以及使用摄像头采集图像,这些都需要授予相应的权限。而且由于录制视频时视频文件所占用的存储空间不断增大,可能需要使用外部存储器(外部SD卡),因此需要授予程序向外部存储设备写入数据的权限。具体方法是在AndroidManifest.xml文件中增加如下授权配置:

<!-- 授予程序录制声音的权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />

<!-- 授予程序使用摄像头的权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

<!-- 授予使用外部存储器的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值