安卓高级开发下笔记共17周第四周.docx
- 文档编号:24702024
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:20
- 大小:207KB
安卓高级开发下笔记共17周第四周.docx
《安卓高级开发下笔记共17周第四周.docx》由会员分享,可在线阅读,更多相关《安卓高级开发下笔记共17周第四周.docx(20页珍藏版)》请在冰豆网上搜索。
安卓高级开发下笔记共17周第四周
第一章多媒体应用开发
第二节录制音频
AndroidMediaRecorder架构详解
MediaRecorder
录制的音频文件是经过压缩后的,需要设置编码器,并且录制的音频文件可以用系统自带的Music播放器播放。
MediaRecorder已经集成了录音、编码、压缩等,并支持少量的录音音频格式,但是这也是他的缺点,支持的格式过少并且无法实时处理音频数据。
MediaRecorder状态图
Initial:
初始状态,当使用new()方法创建一个MediaRecorder对象或者调用了reset()方法时,该MediaRecorder对象处于Initial状态。
Initialized:
已初始化状态,可以通过在Initial状态调用setAudioSource()或setVideoSource()方法进入该状态。
在这个状态可以通过setOutputFormat()方法设置输出格式,此时MediaRecorder转换为DataSourceConfigured状态。
DataSourceConfigured:
数据源配置状态,这期间可以设定编码方式、输出文件、屏幕旋转、预览显示等等。
Prepared:
就绪状态,在DataSourceConfigured状态通过prepare()方法进入该状态。
在这个状态可以通过start()进入录制状态。
Recording:
录制状态,可以在Prepared状态通过调用start()方法进入该状态。
另外,它可以通过stop()方法或reset()方法回到Initial状态。
Released:
释放状态,可以通过在Initial状态调用release()方法来进入这个状态,这时将会释放所有和MediaRecorder对象绑定的资源。
Error:
错误状态,当错误发生的时候进入这个状态,它可以通过reset()方法进入Initial状态。
使用MediaRecorder类录制视频基本步骤如下:
1.调用newMediaRecorder()创建MediaRecorder对象。
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.调用MediaRecorder对象的setOutputFormat()方法设置输出文件的格式。
λMediaRecorder.OutputFormat
通过setOutputFormat(int)方法来控制音视频输出的格式
各个参数的说明:
✓AAC_ADTS:
ADTS的全称是AudioDataTransportStream。
是AAC音频的传输流格式。
是AAC的一种非常常见的传输格式,
✓AMR_NB:
编码的是无视频纯声音3gp文件就是amr,他的文件比AAC的小,他的音乐效果没ACC的好
✓AMR_WB:
VMR-WB是新型可变速率多模式宽带语音编解码器,专为无线CDMA2000标准而设计,目的在于在50至7000HZ的频带上进行语音编码,采样率为16KHZ。
VMR-WB基于3GPPAMR-WB(G722.2)编解码器,在每秒速率12.65Kbit上可实现互操作。
✓DEFAULT:
默认输出
✓MPEG_4:
这将指定录制的文件为mpeg-4格式,可以保护Audio和Video
✓RAW_AMR:
录制原始文件,只支持音频录制,同时要求音频编码为AMR_NB
✓THREE_GPP:
录制后文件是一个3gp文件,支持音频和视频录制
✓WEBM:
编码为VP8/VORBIS的输出格式。
4.设置所录制的音频和视频的编码格式、编码位率等
setAudioEncodingBitRate(intbitRate):
设置声音的编码位率
setAudioSamplingRate(intsamplingRate):
设置声音的采样率
setVideoEncodingBitRate(intbitRate):
设置视频的编码位率
setVideoFrameRate(intrate):
设置视频的帧速率
setVideoSize(intwidth,intheight):
设置视频的宽度和高度
λ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是新型可变速率多模式宽带语音编解码器,专为无线CDMA2000标准而设计,目的在于在50至7000HZ的频带上进行语音编码,采样率为16KHZ。
VMR-WB基于3GPPAMR-WB(G722.2)编解码器,在每秒速率12.65Kbit上可实现互操作。
✓VORBIS:
Vorbis是一种新的音频压缩格式,类似于MP3等现有的音乐格式。
但有一点不同的是,它是完全免费、开放和没有专利限制的。
OGGVorbis有一个很出众的特点,就是支持多声道,随着它的流行,以后用随身听来听DTS编码的多声道作品将不会是梦想。
λ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倍的复杂度基础上,将压缩效率提升一倍以上。
注意:
在执行上述步骤的时候,必须在设置视频文件的输出格式之后再设置音频和视频的编码格式,否则程序将会抛出异常。
5.调用MediaRecorder对象的setOutputFile(Stringpath)方法设置所录制视频文件的保存位置。
6.调用MediaRecorder对象的setPreviewDisplay(Surfacesv)方法设置使用哪个SurfaceView来显示视频预览。
7.调用MediaRecorder对象的prepare()方法准备录制视频。
8.调用MediaRecorder对象的start()方法开始录制视频。
9.录制完成,调用MediaRecorder对象的stop()方法停止录制,并调用release()方法释放资源。
在录制视频的时候需要使用麦克风录制声音以及使用摄像头采集图像,这些都需要授予相应的权限。
而且由于录制视频时视频文件所占用的存储空间不断增大,可能需要使用外部存储器(外部SD卡),因此需要授予程序向外部存储设备写入数据的权限。
具体方法是在AndroidManifest.xml文件中增加如下授权配置:
--授予程序录制声音的权限-->
name="android.permission.RECORD_AUDIO"/> --授予程序使用摄像头的权限--> name="android.permission.CAMERA"/> --授予使用外部存储器的权限--> name="android.permission.WRITE_EXTERNAL_STORAGE"/> 摄像头拍照 从Android5.0开始,Google引入了一套全新的相机框架Camera2(android.hardware.camera2)并且废弃了旧的相机框架Camera1(android.hardware.Camera) ØCamera1使用 使用步骤: 1.调用Camera.open(),打开相机,默认为后置,可以根据摄像头ID来指定打开前置还是后置 2.调用Camera.getParameters()得到一个Camera.Parameters对象 3.使用步骤2得到的Camera.Parameters对象,对拍照参数进行设置 4.调用Camera.setPreviewDispaly(SurfaceHolderholder),指定使用哪个SurfaceView来显示预览图片 5.调用Camera.startPreview()方法开始预览取景 6.调用Camera.takePicture()方法进行拍照 7.拍照结束后,调用Camera.stopPreview()结束取景预览,之后再replease()方法释放资 为什么要使用Camera2 通过Camera2提供的高级特性可以构建出更加高质量的相机应用程序。 1.在开启相机之前检查相机信息 2.在不开启预览的情况下拍照 3.一次拍摄多张不同格式和尺寸的图片 4.控制曝光时间 5.连拍 ØCamera2的5点新特性: (1)支持30帧的高清连拍功能。 (2)支持每帧之间的手动设置。 (3)支持RAW原始图像的拍摄。 (4)支持快门零延迟以及电影速拍。 (5)支持相机其它方面的手动控制,包括噪音消除。 ØCamera2架构概述 Camera2引用了管道的概念,将CameraDevice相机设备和AndroidDevice安卓设备连接起来,androidDevice通过管道发送CaputerRequest拍照请求给CameraDevice,CameraDevice通过管道返回CameraMetaData数据给AndroidDevice,这一切建立在一个叫做CameraCaptureSession。 ØCamera2中比较重要的类及方法 其中CameraManager是所有相机设备(CameraDevice)的管理者,而每个CameraDevice自己会负责建立CameraCaptureSession以及建立CaptureRequest。 CameraCharacteristics是CameraDevice的属性描述类,在CameraCharacteristics中可以进行相机设备功能的详细设定(当然了,首先你得确定你的相机设备支持这些功能才行)。 类图中有着三个重要的callback,其中CameraCaptureSession.CaptureCallback将处理预览和拍照图片的工作,需要重点对待 ØCamera2拍照流程图: 1.调用CameraManager的openCamera(StringcameraId,CameraDevice.StateCallbackcallback,Handlerhandler)方法打开指定摄像头。 该方法的第一个参数cameraId代表要打开的摄像头ID(摄像头ID(通常0代表后置摄像头,1代表前置摄像头);第二个参数用于监听摄像头的状态;第三个参数代表执行callback的Handler,如果程序希望直接在当前线程中执行callback,则可将handler参数设为null。 2.获取CameraDevice对象 当摄像头被打开之后,程序即可获取CameraDevice—即根据摄像头ID获取了指定摄像头设备,然后调用CameraDevice的createCaptureSession(List 该方法的第一个参数是一个List集合,封装了所有需要从该摄像头获取图片的Surface,第二个参数用于监听CameraCaptureSession的创建过程;第三个参数代表执行callback的Handler,如果程序希望直接在当前线程中执行callback,则可将handler参数设为null。 3.设置设置摄像头模式 不管预览还是拍照,程序都调用CameraDevice的createCaptureRequest(inttemplateType)方法创建CaptureRequest.Builder,该方法支持TEMPLATE_PREVIEW(预览)、TEMPLATE_RECORD(拍摄视频)、TEMPLATE_STILL_CAPTURE(拍照)等参数。 通过第3步所调用方法返回的CaptureRequest.Builder设置拍照的各种参数,比如对焦模式、曝光模式等。 调用CaptureRequest.Builder的build()方法即可得到CaptureRequest对象,接下来程序可通过CameraCaptureSession的setRepeatingRequest()方法开始预览,或调用capture()方法拍照。 λCameraManager 管理所有的摄像头(CameraDevice)设备的管理者,用于打开和关闭系统摄像头。 ✓获取该实例的方法: CameraManagermanager=(CameraManager)Context.getSystemService(Context.CAMERA_SERVICE); 或者 CameraManagermanager=(CameraManager)Context.getSystemService(CameraManager.class); ✓getCameraIdList(): 返回当前设备中可用的相机列表,这个id通常都是从0开始并依次递增的 ✓publicCameraCharacteristicsgetCameraCharacteristics(StringcameraId): 根据摄像头id返回该摄像头的相关信息;cameraId,0为后置摄像头、1为前置摄像头 ✓publicvoidopenCamera(StringcameraId,finalCameraDevice.StateCallbackcallback,Handlerhandler) publicvoidopenCamera(StringcameraId,Executorexecutor,finalCameraDevice.StateCallbackcallback)都是打开指定cameraId的相机,只是一个传入Handler,一个传入Executor,是想用线程池来执行Camera中耗时操作 cameraId是一个标识,标识当前要打开的camera callback是一个状态回调,当前camera被打开的时候,这个状态回调会被触发的。 handler指定回调执行的线程。 传null时默认使用当前线程的Looper,我们通常创建一个后台线程来处理。 executor操作线程池 λCameraCharacteristics 描述摄像头的各种特性,其中的属性都是固定的,类似于Camera1中的CamerInfo。 通过CameraManager的getCameraCharacteristics(StringcameraId)方法来获取 包含一个CameraCharacteristics.Key 常搭配CameraCharacteristics.get(CameraCharacteristics.Key ✓get(Key 通过制定的key获取相应的相机参数。 常用的key值有: CameraCharacteristics.LENS_FACING: 获取摄像头方向。 前置摄像头(LENS_FACING_FRONT)或后置摄像头(LENS_FACING_BACK) CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL: 获取当前设备支持的相机特性 CameraCharacteristics.SENSOR_ORIENTATION: 获取摄像头方向 CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP: 获取StreamConfigurationMap,它是管理摄像头支持的所有输出格式和尺寸 CameraCharacteristics.FLASH_INFO_AVAILABLE: 是否支持闪光灯 CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT: 同时检测到人脸的数量 CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES: 相机支持的人脸检测模式 λCameraDevice CameraDevice代表当前连接的相机设备,可以把它看作为相机设备在java代码中的表现,它的职责有以下四个: 根据指定的参数创建CameraCaptureSession。 根据指定的模板创建CaptureRequest。 关闭相机设备。 监听相机设备的状态,例如断开连接、开启成功和开启失败等。 熟悉Camera1的人可能会说CameraDevice就是Camera1的Camera类,实则不是,Camera类几乎负责了所有相机的操作,而CameraDevice的功能则十分的单一,就是只负责建立相机连接的事务,而更加细化的相机操作则交给了稍后会介绍的CameraCaptureSession。 ✓创建方法: 通过CameraManager的openCamera()方法打开相机,在CameraDevice.StateCallback的onOpened(CameraDevicecamera)方法中可获得CameraDevice的实例。 ✓createCaptureRequest(inttemplateType): 创建一个新的拍照请求。 参数templateType代表了请求类型,请求类型一共分为六种,分别为: TEMPLATE_PREVIEW: 创建预览的请求,相机会优先保证高帧率而不是高画质 TEMPLATE_STILL_CAPTURE: 创建一个拍照请求。 相机会优先保证高画质而不是高帧率 TEMPLATE_RECORD: 创建一个录像请求。 相机会使用标准帧率,并设置录像级别的画质 TEMPLATE_VIDEO_SNAPSHOT: 创建一个录像时拍照的请求。 相机会尽可能的保证照片质量的同时不破坏正在录制的视频质量;高于LEGACY TEMPLATE_ZERO_SHUTTER_LAG: 创建一个适用于零快门延迟的请求。 在不影响预览帧率的情况下最大化图像质量 TEMPLATE_MANUAL: 创建一个基本捕获请求,这种请求中所有的自动控制都是禁用的(自动曝光,自动白平衡、自动焦点) 硬件支持等级 在Camera2中,相机设备支持的硬件等级有LEGACY LEVEL_LEGACY: 向后兼容模式,如果是此等级,基本没有额外功能 LEVEL_LIMITED: 有最基本的功能,还支持一些额外的高级功能,这些高级功能是LEVEL_FULL的子集 LEVEL_FULL: 支持对每一帧数据进行控制,还支持高速率的图片拍摄 LEVEL_3: 支持YUV后处理和Raw格式图片拍摄,还支持额外的输出流配置 LEVEL_EXTERNAL: API28中加入的,应该是外接的摄像头,功能和LIMITED类似 ✓createCaptureSession(List 创建CaptureSession会话,一个CameraDevice一次只能开启一个CameraCaptureSession,绝大部分的相机操作都是通过向CameraCaptureSession提交一个Capture请求实现的,例如拍照、连拍、设置闪光灯模式、触摸对焦、显示预览画面等等。 第一个参数outputs是一个List数组,相机会把捕捉到的图片数据传递给该参数中的Surface。 第二个参数StateCallback是创建会话的状态回调。 第三个参数描述了StateCallback被调用时所在的线程 λCameraDevice.StateCallback ✓CameraDevice的内部类StateCallback,一个回调对象,用于接收关于相机的更新状态。 这些状态更新包括关于设备完成启动的通知(允许CameraDe
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高级 开发 笔记 17 四周