通过一个简单的api来看下调用流程,就看MediaRecorder类的setAudioChannels()设置通道数的方法.
废话不多说,直接来看流程.栗子:
MediaRecorder mRecorder = new MediaRecorder();
mRecorder.setAudioChannels(mChannels);1.frameworks/base/media/java/android/media/MediaRecorder.java
public void setAudioChannels(int numChannels) {setParameter("audio-param-number-of-channels=" + numChannels);
}private native void setParameter(String nameValuePair);2.frameworks/base/media/jni/android_media_MediaRecorder.cpp
static void android_media_MediaRecorder_setParameter(JNIEnv *env, jobject thiz, jstring params){sp<MediaRecorder> mr = getMediaRecorder(env, thiz);process_media_recorder_call(env, mr->setParameters(String8(params8)), "java/lang/RuntimeException", "setParameter failed.");
}3.
<1>.frameworks/av/include/media/mediarecorder.h
class MediaRecorder : public BnMediaRecorderClient, public virtual IMediaDeathNotifier{sp<IMediaRecorder> mMediaRecorder;
}<2>.frameworks/av/media/libmedia/mediarecorder.cpp
MediaRecorder::MediaRecorder(const String16& opPackageName) : mSurfaceMediaSource(NULL){const sp<IMediaPlayerService> service(getMediaPlayerService());mMediaRecorder = service->createMediaRecorder(opPackageName);
}status_t MediaRecorder::setParameters(const String8& params) {status_t ret = mMediaRecorder->setParameters(params);
}4.frameworks/av/media/libmedia/IMediaDeathNotifier.cpp
//Binder通信
<1>.const sp<IMediaPlayerService> IMediaDeathNotifier::getMediaPlayerService(){sMediaPlayerService == 0;sp<IServiceManager> sm = defaultServiceManager();sp<IBinder> binder;//此处为代理获取media.player对应的服务binder = sm->getService(String16("media.player"));sMediaPlayerService = interface_cast<IMediaPlayerService>(binder);
}<2>.frameworks/av/media/libmediaplayerservice/MediaPlayerService.cppvoid MediaPlayerService::instantiate() {//添加media.player字符串对应的MediaPlayerService服务defaultServiceManager()->addService(String16("media.player"), new MediaPlayerService());}
}<3>.frameworks/av/media/mediaserver/main_mediaserver.cpp
int main(int argc __unused, char **argv __unused){//启动MediaPlayerService服务MediaPlayerService::instantiate();ResourceManagerService::instantiate();//启动线程池ProcessState::self()->startThreadPool();//添加到线程池IPCThreadState::self()->joinThreadPool();
}<4>.frameworks/av/media/libmedia/mediarecorder.cpp
接着上边继续追service->createMediaRecorder()
MediaRecorder::MediaRecorder(const String16& opPackageName) : mSurfaceMediaSource(NULL){const sp<IMediaPlayerService> service(getMediaPlayerService());mMediaRecorder = service->createMediaRecorder(opPackageName);
}5.frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
sp<IMediaRecorder> MediaPlayerService::createMediaRecorder(const String16 &opPackageName){sp<MediaRecorderClient> recorder = new MediaRecorderClient(this, pid, opPackageName);wp<MediaRecorderClient> w = recorder;mMediaRecorderClients.add(w);return recorder;
}6.frameworks/av/media/libmediaplayerservice/MediaRecorderClient.cpp
MediaRecorderClient::MediaRecorderClient(const sp<MediaPlayerService>& service, pid_t
pid, const String16& opPackageName){mRecorder = AVMediaServiceFactory::get()->createStagefrightRecorder(opPackageName);mMediaPlayerService = service;
}7.frameworks/av/media/libavextensions/mediaplayerservice/AVMediaServiceFactory.cpp
StagefrightRecorder *AVMediaServiceFactory::createStagefrightRecorder(const String16
&opPackageName) {return new StagefrightRecorder(opPackageName);
}8.frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp
<1>.构造函数
StagefrightRecorder::StagefrightRecorder(const String16 &opPackageName): MediaRecorderBase(opPackageName),mWriter(NULL),  mOutputFd(-1), mAudioSource(AUDIO_SOURCE_CNT),mVideoSource(VIDEO_SOURCE_LIST_END),mStarted(false)
{ALOGV("Constructor");reset();
}注意:所以frameworks/av/media/libmedia/mediarecorder.cpp里的mMediaRecorder->setParameters(params);调用的是StagefrightRecorder.cpp里的
<2>.status_t StagefrightRecorder::setParameters(const String8 &params){const char *cparams = params.string();const char *key_start = cparams;String8 key(key_start, equal_pos - key_start);setParameter(key, value);
}<3>.status_t StagefrightRecorder::setParameter(const String8 &key, const String8 &value)
{//由上文得出,走此分支else if (key == "audio-param-number-of-channels") {int32_t number_of_channels;if (safe_strtoi32(value.string(), &number_of_channels)) {return setParamAudioNumberOfChannels(number_of_channels);}}
}<4>.status_t StagefrightRecorder::setParamAudioNumberOfChannels(int32_t channels) {mAudioChannels = channels;//将mAudioChannels传出来
}<5>.sp<MediaCodecSource> StagefrightRecorder::createAudioSource() {sp<AudioSource> audioSource = AVFactory::get()->createAudioSource(mAudioSource,mOpPackageName,sourceSampleRate,mAudioChannels,mSampleRate,mClientUid,mClientPid);
}9.frameworks/av/media/libavextensions/stagefright/AVFactory.cpp
AudioSource* AVFactory::createAudioSource(audio_source_t inputSource,const String16 &opPackageName,uint32_t sampleRate,uint32_t channels,uint32_t outSampleRate,uid_t clientUid,pid_t clientPid) {return new AudioSource(inputSource, opPackageName, sampleRate,channels, outSampleRate, clientUid, clientPid);
}10.frameworks/av/media/libstagefright/AudioSource.cpp
AudioSource::AudioSource( audio_source_t inputSource, const String16 &opPackageName,uint32_t sampleRate, uint32_t channelCount, uint32_t outSampleRate,uid_t uid, pid_t pid)
{status_t status = AudioRecord::getMinFrameCount(&minFrameCount,sampleRate,AUDIO_FORMAT_PCM_16_BIT,                                         audio_channel_in_mask_from_count(channelCount));mRecord = new AudioRecord(inputSource, sampleRate, AUDIO_FORMAT_PCM_16_BIT,audio_channel_in_mask_from_count(channelCount),opPackageName,(size_t) (bufCount * frameCount),AudioRecordCallbackFunction,this,frameCount /*notificationFrames*/,AUDIO_SESSION_ALLOCATE,AudioRecord::TRANSFER_DEFAULT,AUDIO_INPUT_FLAG_NONE,uid,pid);
}11.frameworks/av/media/libmedia/AudioRecord.cpp
AudioRecord::AudioRecord( audio_source_t inputSource,uint32_t sampleRate,audio_format_t format,audio_channel_mask_t channelMask,const String16& opPackageName,size_t frameCount,callback_t cbf,void* user,uint32_t notificationFrames,audio_session_t sessionId,transfer_type transferType,audio_input_flags_t flags,int uid,pid_t pid,const audio_attributes_t* pAttributes){set(inputSource, sampleRate, format, channelMask, frameCount, cbf, user,notificationFrames, false /*threadCanCallJava*/, sessionId, transferType,
flags, uid, pid, pAttributes);
}今天就到这吧,有时间可以继续往下跟...

Android MediaRecorder调用AudioRecord流程相关推荐

  1. Android 调用系统api录音的两种方式(MediaRecorder、AudioRecord)

    废话 权限.权限.权限,必须要先获取了录音权限,其他的事情晚点再说. 另外,新版本的Android 10系统会对录音有调整,引入了一个录音焦点的概念,也就是说以前的麦克风只能一个APP使用,必须要等它 ...

  2. Android Camera(5)---Android Camera调用流程

    Android Camera调用流程 http://blog.csdn.net/lushengchu_luis/article/details/11033095 1.Packages/apps/到fr ...

  3. Android实现边录边播(MediaRecorder和AudioRecord)

    Android可以通过MediaRecorder和AudioRecord这两个工具来实现录音,MediaRecorder直接把麦克风的数据存到文件,并且能够直接进行编码(如AMR,MP3等),而Aud ...

  4. android 录音原始文件_Android 录音详解(一)—— MediaRecorder、AudioRecord、生成wav格式、边录边播...

    Android 录音详解(一)-- MediaRecorder.AudioRecord.生成wav格式.边录边播 越来越多的 APP 都用到了手机的录音功能,比如搜索.聊天.输入.K歌等... 本系列 ...

  5. Android MediaRecorder架构详解

    1. 简介 在android中录制音频有两种方式,MediaRecorder和AudioRecord.两者的区别如下: (1) MediaRecorder 简单方便,不需要理会中间录制过程,结束录制后 ...

  6. [Android] [音视频系列]在 Android 平台使用 AudioRecord 和 AudioTrack API 完成音频 PCM 数据的采集和播放,并实现读写音频 wav 文件

    参考 官方文档地址:https://developer.android.google.cn/reference/android/media/AudioRecord GitHub 地址:https:// ...

  7. Android录音下————AudioRecord源码分析

    Android录音下----AudioRecord源码分析 文章目录 Android录音下----AudioRecord源码分析 一.概述 1.主要分析点 2.储备知识 二.getMinBufferS ...

  8. [Android][MediaRecorder] Android MediaRecorder框架简洁梳理

    Android MediaRecorder框架简洁梳理 一.MediaRecorder整体架构 1.1 MediaRecorder录制数据流框架 1.2 PersistentSurface及Graph ...

  9. android支付宝调用

    android客户端调用支付宝,主要是获取订单信息后,唤起对应支付平台进行支付业务 操作流程,小白表示对整体的流程不是很清楚,这里只是大致说下测通支付流程 第一步:仿照文档上写, 地址:支付宝集成流程 ...

最新文章

  1. 不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧
  2. python求两数最大公因数_『用python求俩个数的最大公约数和最小公倍数』
  3. Kafka 副本OffsetOutOfRangeException
  4. 5.2jquery案例2
  5. [CareerCup] 1.1 Unique Characters of a String 字符串中不同的字符
  6. 4.与JSP的第一次握手
  7. Word2019 mac 16.46beta更新(兼容big sur,适配M1)
  8. mysql 8 免安装版 下载及配置
  9. UML学习笔记--导航
  10. quartz的job类无法保留本身通过spring注入的属性问题
  11. 列顺序对SQL Server复合索引的影响
  12. 未找到与约束ContractName,无法打开项目的解决方案
  13. 省会城市房价地图,这9座新星城市正在悄然崛起
  14. android sqlite 保存图片,android-如何将图像在Sqlite数据库中另存为blob?
  15. ElasticJob‐Lite:事件追踪
  16. vue-echart简单使用
  17. Android 通知设置
  18. 【PHP】\r \r\n \t是什么
  19. 微信小商店购物组件接入现有的小程序,在开发者工具中使用
  20. 山东理工ACM【1009】Elevator

热门文章

  1. 大话IT第14期:iOS、Android、Mango 你的选择?
  2. Mysql 5 replication(mysql主从双机策略)
  3. BPMN 2.0 流程设计
  4. matlab的libsvm工具箱(faruto版本)配置问题汇总,用于VS2015+R2017a
  5. 异常已存在具有相同键的条目。_从Viticis Fructus分离的环烯醚萜类化合物抑制紫杉醇诱导的小鼠机械性异常性疼痛...
  6. php随机显示怎么,PHP 随机显示
  7. sql integer字置为空_请写一个函数来检查用户提交的数据是否为整数
  8. jdk8 HashMap初始化和扩容机制
  9. 《代码的未来》读书笔记:内存管理与GC那点事儿
  10. 什么是OPTEE-OS