ImageVerifierCode 换一换
格式:DOC , 页数:15 ,大小:247.50KB ,
资源ID:2585778      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2585778.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(关于android电话录音问题的详细分析.doc)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

关于android电话录音问题的详细分析.doc

1、关于android电话录音问题的详细分析作者:老猫 一直以来都是在网络上看别人的文章,老老实实的做潜水员,今天一时兴起,写点东西,希望对大家有所帮助,不要再走同样的弯路。本文是关于Android下录音问题的分析,网络上都说Android录音时记录下的语音信号都是混音器的信号。但是都没有给出详细说明为什么是这样。我们知道Android下进行电话录音的代码很简单:大致流程如下:recorder = new MediaRecorder();/这里mode可以设置为 VOICE_UPLINK|VOICE_DOWNLINK|VOICE_CALLrecorder.setAudioSource(mode);

2、recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);recorder.setOutputFile(recFile.getAbsolutePath();/准备录音recorder.prepare();/启动录音recorder.start();/停止录音recorder.stop();MediaRecorder.AudioSource中定义了以下常量可以用于recorder.setAudioSource这里

3、和电话录音相关的有3个常量Voice_call 录制上行线路和下行线路Voice_uplink 录制上行线路,应该是对方的语音Voice_downlink 录制下行线路,应该是我方的语音网络上关于java层如何调用native代码的介绍很多,这里只做简单介绍。JAVA中MediaRecorder的方法会掉用本地C+代码,这些代码编译后为libmedia.so,再通过进程间通信机制Binder和MediaServer通信,MediaServer收到请求后,把这些请求转发给opencore。以下是Android的媒体库框架图,从网络上下载的。从上图可以看出,客户端调用的本地代码位于libmedia

4、.so中,媒体服务进程调用的代码位于libmediaplayerservice.so中。libmediaplayerservice.so再调用底层的libopencoreplayer.so完成具体功能。以下通过代码介绍媒体服务进程如何转发请求到opencore中。关于客户端mediarecorder如何与媒体服务进程交互请搜索网络,这方面文章很多,这里就不多介绍。总而言之,客户端的一个mediarecorder对象和服务器端的MediaRecorderClient对象对应,客户端通过mediarecorder发送的请求,通过进程间通信机制最终都会发送到服务端的MediaRecorderClie

5、nt类中。我们来看下内部类client的声明,代码位于frameworksbasemedialibmediaplayerserviceMediaRecorderClient.hclass MediaRecorderClient : public BnMediaRecorderpublic: virtual status_tsetCamera(const sp& camera); virtual status_t setPreviewSurface(const sp& surface); virtual status_t setVideoSource(int vs); virtual statu

6、s_t setAudioSource(int as); virtual status_t setOutputFormat(int of); virtual status_t setVideoEncoder(int ve); virtual status_t setAudioEncoder(int ae); virtual status_t setOutputFile(const char* path); virtual status_t setOutputFile(int fd, int64_t offset, int64_t length); virtual status_t setVide

7、oSize(int width, int height); virtual status_t setVideoFrameRate(int frames_per_second); virtual status_t setParameters(const String8& params); virtual status_t setListener(const sp& listener); virtual status_t prepare(); virtual status_t getMaxAmplitude(int* max); virtual status_t start(); virtual

8、status_t stop(); virtual status_t reset(); virtual status_t init(); virtual status_t close(); virtual status_t release();。可以看到,大部分客户端方法在MediaRecorderClient中都有对应方法。这样当我们调用客户端的recorder.start();时,最后会调用到MediaRecorderClient类中的start方法。status_t MediaRecorderClient:start() LOGV(start); Mutex:Autolock lock(m

9、Lock); if (mRecorder = NULL) LOGE(recorder is not initialized); return NO_INIT; return mRecorder-start();/转发给mRecorder /这里的mRecorder是在MediaRecorderClient构造函数中创建的。MediaRecorderClient:MediaRecorderClient(const sp& service, pid_t pid) 。#ifndef NO_OPENCORE /创建了PVMediaRecorder用于录音 mRecorder = new PVMedia

10、Recorder(); #else mRecorder = NULL; #endif mMediaPlayerService = service; 其他的调用也是一样,所有的请求基本都转发给了PVMediaRecorder,这个PVMediaRecorder就是opencore中的对应的录音的类。这样,我们就直接进入opencore分析,先看看PVMediaRecorder的声明,代码位于frameworksbaseincludemediaPVMediaRecorder.h,可以看到,客户端的方法在这里基本都有对应的方法。class PVMediaRecorder : public Media

11、RecorderBase public: PVMediaRecorder(); virtual PVMediaRecorder(); virtual status_t init(); virtual status_t setAudioSource(audio_source as); virtual status_t setVideoSource(video_source vs); virtual status_t setOutputFormat(output_format of); virtual status_t setAudioEncoder(audio_encoder ae); virt

12、ual status_t setVideoEncoder(video_encoder ve); virtual status_t setVideoSize(int width, int height); virtual status_t setVideoFrameRate(int frames_per_second); virtual status_t setCamera(const sp& camera); virtual status_t setPreviewSurface(const sp& surface); virtual status_t setOutputFile(const c

13、har *path); virtual status_t setOutputFile(int fd, int64_t offset, int64_t length); virtual status_t setParameters(const String8& params); virtual status_t setListener(const sp& listener); virtual status_t prepare(); virtual status_t start(); virtual status_t stop(); virtual status_t close(); virtual status_t reset(); virtual status_t getMaxAmplitude(int *max);private: status_t doStop(); AuthorDriverWrapper* mAuthorDriverWrapper; PVMediaRecorder(const PVMediaRecorder &); PVMediaRecorder &operator=(const PVMediaRecorder &);Opencore是一个第3方的库,体系比

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1