Android之mediarecorder中的方法以及工作流程的过程
嵌套、关联的类
class |
MediaRecorder.AudioEncoder |
定义音频编码 |
class |
MediaRecorder.AudioSource |
定义声音资源 |
interface |
MediaRecorder.OnErrorListener |
Interface definition for a callback to be invoked when an error occurs while recording. |
interface |
MediaRecorder.OnInfoListener |
Interface definition for a callback to be invoked when an error occurs while recording. |
class |
MediaRecorder.OutputFormat |
定义输出格式 |
class |
MediaRecorder.VideoEncoder |
定义视频编码 |
class |
MediaRecorder.VideoSource |
定义视频source |
3 主要方法:
final static int |
getAudioSourceMax() Gets the maximum value for audio sources. 获取音频信号源的最高值。 |
int |
getMaxAmplitude() Returns the maximum absolute amplitude that was sampled since the last call to this method. 最后调用这个方法采样的时候返回最大振幅的绝对值 |
void |
prepare() Prepares the recorder to begin capturing and encoding data. 准备recorder 开始捕获和编码数据 |
void |
release() Releases resources associated with this MediaRecorder object. 发布与此MediaRecorder对象关联的资源 |
void |
reset() Restarts the MediaRecorder to its idle state. 重新启动mediarecorder到空闲状态 |
void |
setAudioChannels(int numChannels) Sets the number of audio channels for recording. 设置录制的音频通道数。 |
void |
setAudioEncoder(int audio_encoder) Sets the audio encoder to be used for recording. 设置audio的编码格式 |
void |
setAudioEncodingBitRate(int bitRate) Sets the audio encoding bit rate for recording. 设置录制的音频编码比特率 |
void |
setAudioSamplingRate(int samplingRate) Sets the audio sampling rate for recording. 设置录制的音频采样率。 |
void |
setAudioSource(int audio_source) Sets the audio source to be used for recording. 设置用于录制的音源。 |
void |
setAuxiliaryOutputFile(String path) Pass in the file path for the auxiliary time lapse video. 辅助时间的推移视频文件的路径传递。 |
void |
setAuxiliaryOutputFile(FileDescriptor fd) Pass in the file descriptor for the auxiliary time lapse video. 在文件描述符传递的辅助时间的推移视频 |
void |
setCamera(Camera c) Sets a Camera to use for recording. 设置一个recording的摄像头 |
void |
setCaptureRate(double fps) Set video frame capture rate. 设置视频帧的捕获率 |
void |
setMaxDuration(int max_duration_ms) Sets the maximum duration (in ms) of the recording session. 设置记录会话的最大持续时间(毫秒) |
void |
setMaxFileSize(long max_filesize_bytes) Sets the maximum filesize (in bytes) of the recording session. 设置记录会话的最大大小(以字节为单位) |
void |
setOnErrorListener(MediaRecorder.OnErrorListener l) Register a callback to be invoked when an error occurs while recording. 注册一个回调被调用发生错误时,同时录制 |
void |
setOnInfoListener(MediaRecorder.OnInfoListener listener) Register a callback to be invoked when an informational event occurs while recording. 注册要同时记录一个信息事件发生时调用的回调。 |
void |
setOrientationHint(int degrees) Sets the orientation hint for output video playback. 设置输出的视频播放的方向提示 |
void |
setOutputFile(FileDescriptor fd) Pass in the file descriptor of the file to be written. 传递要写入的文件的文件描述符 |
void |
setOutputFile(String path) Sets the path of the output file to be produced. 设置输出文件的路径 |
void |
setOutputFormat(int output_format) Sets the format of the output file produced during recording. 设置在录制过程中产生的输出文件的格式 |
void |
setPreviewDisplay(Surface sv) Sets a Surface to show a preview of recorded media (video). 表面设置显示记录媒体(视频)的预览 |
void |
setProfile(CamcorderProfile profile) Uses the settings from a CamcorderProfile object for recording. 从一个记录CamcorderProfile对象的使用设置 |
void |
setVideoEncoder(int video_encoder) Sets the video encoder to be used for recording. 设置视频编码器,用于录制 |
void |
setVideoEncodingBitRate(int bitRate) Sets the video encoding bit rate for recording. 设置录制的视频编码比特率。 |
void |
setVideoFrameRate(int rate) Sets the frame rate of the video to be captured. 设置要捕获的视频帧速率 |
void |
setVideoSize(int width, int height) Sets the width and height of the video to be captured. 设置要捕获的视频的宽度和高度 |
void |
setVideoSource(int video_source) Sets the video source to be used for recording. 开始捕捉和编码数据到setOutputFile(指定的文件) |
void |
start() Begins capturing and encoding data to the file specified with setOutputFile(). |
void |
stop() Stops recording. 停止recording |
视频编码格式:default,H263,H264,MPEG_4_SP
音频编码格式:default,AAC,AMR_NB,AMR_WB,
输出方式:amr_nb,amr_wb,default,mpeg_4,raw_amr,three_gpp.
4 流程分析
一、 java层
1、java应用层
java应用层主要是一些接口的调用,它并没有具体功能代码的实现,java应用层的代码路径为:
android/packages/apps/SoundRecorder/src/com/android/soundrecorder/
该目录下有文件: SoundRecorder.java Recorder.java VUMeter.java
soundrecorder.java是程序的入口文件,我们在可以在里面设置文件输出编码格式的格式,现在系统默认支持两种格式amr和3gpp格式。设置代码如下:
mRequestedType =AUDIO_3GPP; //02 AUDIO_AMR;
接着运行mRecorder = new Recorder();创建一个Recorder类。Recorder类在Recorder.java中定义。
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(outputfileformat);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile(mSampleFile.getAbsolutePath());
} catch(IOException exception) {
2、JAVA Framework层
frameworks/base/media/java/android/media/MediaRecorder.java
3、JAVA本地调用部分(JNI):
frameworks/base/media/jni/android_media_MediaRecorder.cpp
jni层的只是实现了方法的注册,为java层调用C++程序提供一种注册。
这三给部分的程序会编译成一个libmedia_jni.so库,java层序的调用都是调用该库中的接口。具体的实现要要在我们的多媒体底层库。
二、 多媒体底层库
1、ImediaRecorder.cpp
class BpMediaRecorder: public BpInterface
BpMediaRecorder(const sp& impl) : BpInterface(impl) {}
status_t setCamera(const sp& camera);
status_t setPreviewSurface(const sp& surface);
status_t setVideoSource(int vs);
status_t setAudioSource(int as);
status_t setOutputFormat(int of);
status_t setAudioEncoder(int ae);
status_t setOutputFile(const char* path);
status_t getMaxAmplitude(int* max);
上面的每个函数中都用transact方法来向bn发出请求。然后调用return reply.readInt32();将从bn返回的数据传送个他们的调用函数。
2、Mediarecorder.cpp
MediaRecorder::MediaRecorder()
sp sm = defaultServiceManager();
binder =sm->getService(String16("media.player"));
sp service = interface_cast(binder);
mMediaRecorder = service->createMediaRecorder(getpid());
mCurrentState = MEDIA_RECORDER_IDLE;
该文件操作的方法是mMediaRecorder的方法,它主要是同过binder机制将请求传输送给mediarecorder的服务进程。
3、多媒体服务部分
mediaRecorder的服务文件是MediaRecorderClient.cpp,它主要调用的是PVMediaRecorder的实现方法,在此请求opencore的服务。
MediaRecorderClient::MediaRecorderClient(pid_t pid)
mRecorder = new PVMediaRecorder();
三、Opencore
PVMediaRecorder的setOutputFile方法会打开我们上面指定的文件路径下的文件,为写文件作好准备。代码如下:
int fd = open(path, O_RDWR | O_CREAT );
AuthorDriverWrapper::AuthorDriverWrapper()
mAuthorDriver = new AuthorDriver();
return mAuthorDriver->enqueueCommand(ac, comp, cookie);
四、audioflinger层和audiorecord
1、AudioRecord
音频系统的对外接口是AudioRecord,它通过iBinder来远程调用Audioflinger的openRecorder函数。AudioRecord构造函数如下:
log_wj("ENTERIN::--%s---%s---\n",__FILE__,__FUNCTION__);
mStatus = set(streamType, sampleRate, format, channelCount,
frameCount, flags, cbf, user, notificationFrames);
status_t AudioRecord::set(int streamType,
const sp& audioFlinger = AudioSystem::get_audio_flinger();
//获取缓存大小,间接调用我们修改过该函数(经过三次调用中转),返回值为//channelCount*320
AudioSystem::getInputBufferSize(sampleRate, format,channelCount, &inputBuffSizeInBytes);
//远程调用audioFlinger的openrecord函数,openRecord相当于audioflinger为audioRecord
sp record = audioFlinger->openRecord(getpid(),streamType,
mClientRecordThread = new ClientRecordThread(*this,threadCanCallJava);
AudioRecord相当于一个代理,它的线程是用来处理其它客户的请求。
2、AudioFlinger
if (mAudioRecordThread == 0) {
LOGE("Audio record thread not started");
wclient = mClients.valueFor(pid);
client = new Client(this, pid);
// create new record track. The record track uses one trackin mHardwareMixerThread by //convention.
//生成一个recordTrack用来作为数据的中转(audioflinger与audiorecord之间)。
//他们使用audio_track_cblk_t数据结构来传输数据。
if (recordTrack->getCblk() == NULL) {
// return to handle to client------我们的audiorecord。
recordHandle = new RecordHandle(recordTrack);
Audioflinger则负责从音频设备读取数据放置到audio_track_cblk_t数据结构中。
input =mAudioHardware->openInputStream(mRecordTrack->format(),
mRecordTrack->channelCount(),mRecordTrack->sampleRate(),
(AudioSystem::audio_in_acoustics)(mRecordTrack->mFlags>> 16));
if (LIKELY(mRecordTrack->getNextBuffer(&buffer) ==NO_ERROR&&
(int)buffer.frameCount == inFrameCount) ) {
ssize_t bytesRead = input->read(buffer.raw,inBufferSize);
mRecordTrack->releaseBuffer(&buffer);
首先从audio_track_cblk_t取得缓冲区,然后调用input的read方法读取数据,最后释放缓冲区,检查是否溢出。
五、 硬件抽象层
ssize_t AudioStreamInALSA::read(void *buffer, ssize_tbytes)
tmp1=(short int *)malloc(bytes*2);
n = snd_pcm_readi(mHandle, tmp1,snd_pcm_bytes_to_frames(mHandle, bytes*2));
n = snd_pcm_recover(mHandle, n, 0);
5主要能设置列举
1 setAudioChannels(int numChannels) 设置录制的音频通道数。
2 setAudioEncoder(int audio_encoder) 设置audio的编码格式
3 setAudioEncodingBitRate(int bitRate) 设置录制的音频编码比特率
4 setAudioSamplingRate(int samplingRate) 设置录制的音频采样率。
5 setAudioSource(int audio_source) 设置用于录制的音源。
6 setAuxiliaryOutputFile(String path) 辅助时间的推移视频文件的路径传递。
7 setAuxiliaryOutputFile(FileDescriptor fd)在文件描述符传递的辅助时间的推移视频
8 setCamera(Camera c) 设置一个recording的摄像头
9 setCaptureRate(double fps) 设置视频帧的捕获率
10 setMaxDuration(int max_duration_ms) 设置记录会话的最大持续时间(毫秒)
11 setMaxFileSize(long max_filesize_bytes) 设置记录会话的最大大小(以字节为单位)
12 setOutputFile(FileDescriptor fd) 传递要写入的文件的文件描述符
13 setOutputFile(String path) 设置输出文件的路径
14 setOutputFormat(int output_format) 设置在录制过程中产生的输出文件的格式
15 setPreviewDisplay(Surface sv) 表面设置显示记录媒体(视频)的预览
16 setVideoEncoder(int video_encoder) 设置视频编码器,用于录制
17 setVideoEncodingBitRate(int bitRate) 设置录制的视频编码比特率。
18 setVideoFrameRate(int rate) 设置要捕获的视频帧速率
19 setVideoSize(int width, int height) 设置要捕获的视频的宽度和高度
20 setVideoSource(int video_source) 开始捕捉和编码数据到setOutputFile(指定的文件)
视频编码格式:default,H263,H264,MPEG_4_SP
音频编码格式:default,AAC,AMR_NB,AMR_WB,
获得音频资源:defalut,camcorder,mic,voice_call,voice_communication,voice_downlink,
voice_recognition, voice_uplink;
输出方式:amr_nb,amr_wb,default,mpeg_4,raw_amr,three_gpp.
Android之mediarecorder中的方法以及工作流程的过程相关推荐
- mediarecorder中的方法以及工作流程的过程
嵌套.关联的类 class MediaRecorder.AudioEncoder 定义音频编码 class MediaRecorder.AudioSource 定义声音资源 interface Med ...
- 【spring源码系列-05】refresh中prepareRefresh方法的执行流程
Spring源码系列整体栏目 内容 链接地址 [一]spring源码整体概述 https://blog.csdn.net/zhenghuishengq/article/details/13094088 ...
- ios开发 mvp实践_实践中开发人员的工作流程-我们如何在30天内建立MVP
ios开发 mvp实践 by Léna Faure 莱娜·福雷(LénaFaure) 实践中开发人员的工作流程-我们如何在30天内建立MVP (The developer's workflow i ...
- android物理按键输入法,Android输入法框架中按键消息的处理流程
最近研究了一下Android输入法,发现Android输入法框架中按键消息的处理流程和一般应用程序的处理流程有很大的不同,故在此做个总结. 一.一些名词缩写 IMF(Input MethodFrame ...
- Android中管理代码基本工作流程
原文地址 译者:远方的自由 转载请注明出处: http://blog.csdn.net/z2066411585 描述 管理Android代码需要使用Git(一个开源的版本控制系统)和Repo(Git上 ...
- Android 自定义ViewGroup中onFinishInflate方法可以用来干什么
onFinishInflate 当View中所有的子控件均被映射成xml后触发 也就是会在Activity中调用setContentView之后就会调用onFinishInflate这个方法,这个方法 ...
- 综述(五)无人驾驶中决策系统的工作流程及原理
汽车在通过感知系统获取到周围环境的信息后,需要进行最为核心的大脑决策工作,通过采用最优的决策方法,达到安全驾驶汽车的目的.决策结果最终输出给执行模块,实现汽车的加减速.转向.变换车道.超越前车等功能. ...
- ODOO15中如何让销售工作流程全自动完成?
在ODOO中,一个完成的销售工作包括:销售报价单-->销售订单-->拣货.发货-->结算单-->付款单-->生成会计凭证.这些各个环节本来是需要一步一步的自行,如果你需要 ...
- 综述(三)无人驾驶中感知系统的工作流程及原理
人在路上行走时,需要有眼睛.耳朵.鼻子.触觉等器官才能感知周围的状况,从而为自己的大脑做决策提供依据.无人驾驶汽车在路上行驶,更加需要感知周围的环境.而且,由于汽车的车载计算机,在智能程度上还远不及人 ...
最新文章
- 【点云StatisticalOutlierFilter】python-pcl:去除离群点
- 重磅直播|基于格雷码结合相移技术的高鲁棒性高效率动态三维面形测量
- CKEditor代码高亮显示插件Code Snippet安装及使用方法
- linux系统性能优化及瓶颈分析
- 钱趣多风控新举措:源头选择与物理隔离
- mysql截取字符串函数left和right和substring和substring_index
- win10远程桌面连接ubuntu18.04
- Net设计模式实例之代理模式(Proxy Pattern)
- arduino w5500 mysql,W5500网络模块会出现奇怪的问题
- DIP(依赖倒置原则),IoC(控制反转),DI(依赖注入)复习总结
- mysql意外关闭xampp_错误:MySQL意外关闭xampp 3.2.4
- ORACLE锁的管理
- tongweb php,TongWeb服务器部署
- java程序如何提取数据库json格式_java解析json格式文件,再保存在数据库怎么做?...
- Max Script|多边形的控制
- 解决每次打开office都提示windows正在配置visio的问题以及office2013闪退问题
- 业务流程图有哪些?一篇文章带你了解和绘制业务流程图
- 模拟赛DAY 2 T2不老梦
- 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
- java IO学习心得
热门文章
- Id都是“とつくとき”这样的怎么爬,在线等,急
- Azure data studio 跨平台数据库管理工具试用
- 程序员修神之路--那些分布式事务解决方案
- 我们是如何做DevOps的?
- 消息队列,我只选RabbitMQ!
- 五分钟了解数据库事务隔离
- asp.net core 自定义基于 HttpContext 的 Serilog Enricher
- .NetCore使用skywalking实现实时性能监控
- [机器翻译]参与 Microsoft 开放源代码软件项目的方式
- 手把手教你写DI_3_小白徒手支持 Singleton 和 Scoped 生命周期