AudioRecorder 录音相关的处理流程
生活随笔
收集整理的這篇文章主要介紹了
AudioRecorder 录音相关的处理流程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一.AudioRecord錄音的初始化設置
AudioRecord::set
?->
AudioSystem::getInput
?->
調用IAudioPolicyService.cpp文件中的
BpAudioPolicyService的getInput函數
??? remote()->transact(GET_INPUT, data, &reply);
[cpp]?view plaincopy BnAudioPolicyService::onTransact(?? case?GET_INPUT:?? ????audio_io_handle_t?input?=?getInput(inputSource,?? ???????????????????????????????????samplingRate,?? ???????????????????????????????????format,?? ???????????????????????????????????channels,?? ???????????????????????????????????acoustics);?//?調用的是AudioPolicyService::getInput函數??
?->
AudioPolicyService::getInput
?->
AudioPolicyManagerBase::getInput
??? mpClientInterface->openInput
?->
AudioPolicyService::openInput
?->
BpAudioFlinger的openInput函數
?->
AudioFlinger::openInput
??? mAudioHardware->openInputStream
?->
[cpp]?view plaincopy AudioHardwareALSA::openInputStream?? ????err?=?mALSADevice->open(&(*it),?devices,?mode(),?0);?? ?? ????in?=?new?AudioStreamInALSA(this,?&(*it),?acoustics);?? ????err?=?in->set(format,?channels,?sampleRate);??
?->
alsa_default.cpp
調用s_open函數
[cpp]?view plaincopy ALSAStreamOps::set?? ????if?(rate?&&?*rate?>?0)?{?? ????????if?(mHandle->sampleRate?!=?*rate)?{?? ????????????LOGE("%s?L%d??mHandle->sampleRate?=?%d,?return?BAD_VALUE?%d?",?__FUNCTION__,?__LINE__,???mHandle->sampleRate,?BAD_VALUE);?? ????????????return?BAD_VALUE;?? ????????}?? ????}??
E/AudioHardwareALSA( 1181): set L123? mHandle->sampleRate = 8000, return BAD_VALUE -22 // 如果采樣率不是8000,則返回BAD_VALUE
E/AudioHardwareALSA( 1181): openInputStream L314 in->set err = -22
// BAD_VALUE的定義是
BAD_VALUE?????????? = -EINVAL,
#define EINVAL?? ??? ?3
按照以上定義,BAD_VALUE的值應該是-3,但log輸出的值是-22,很奇怪。
----------------------------------------------------------------------------------
二.錄音start函數的處理流程
1.如果是錄像,則錄像中的音頻錄制的調用順序是:
MPEG4Writer::start
->
MPEG4Writer::startWriterThread()
->
MPEG4Writer::startTracks
->
MPEG4Writer::Track::start
->
錄像時,video track是CameraSource,即調用CameraSource::start函數
audio track是AMRNBEncoder,即調用AMRNBEncoder::start函數
->
2.如果是單純的錄音操作,則直接走下面的路程:
AudioSource::start
->
AudioRecord::start()
->
IAudioRecord::start()
如果返回值為DEAD_OBJECT,則調用
->
AudioRecord::openRecord
? ->
? AudioFlinger::openRecord
? ->
? 返回RecordHandle對象
? ->
? AudioFlinger::RecordHandle::start()
? ->
? AudioFlinger::RecordThread::start
? ->
? AudioSystem::startInput(mId);
? ->
? AudioPolicyService::startInput
? ->
? AudioPolicyManagerBase::startInput
如果AudioRecord::openRecord返回NO_ERROR,則繼續調用IAudioRecord::start()
如果IAudioRecord::start()返回NO_ERROR,則啟動ClientRecordThread線程。
----------------------------------------------------------------------------------
三.AudioRecord開始錄音的處理流程
1.frameworks\base\media\java\android\media\AudioRecord.java文件中的
startRecording()函數
[cpp]?view plaincopy //?start?recording?? synchronized(mRecordingStateLock)?{?//?一直處于同步狀態,同一時間只能有一個錄音?? ????if?(native_start()?==?SUCCESS)?{?//?調用native方法?? ????????mRecordingState?=?RECORDSTATE_RECORDING;?? ????}?? }??
->
2.native_start對應frameworks\base\core\jni\android_media_AudioRecord.cpp文件中的
android_media_AudioRecord_start 函數
取得AudioRecord對象lpRecorder,然后調用lpRecorder->start()的函數,開始錄音
->
3.frameworks\base\media\libmedia\AudioRecord.cpp文件的
AudioRecord::start()函數
3.1 取得ClientRecordThread對象t
3.2 調用IAudioRecord對象mAudioRecord->start()
AudioRecord::set
?->
AudioSystem::getInput
?->
調用IAudioPolicyService.cpp文件中的
BpAudioPolicyService的getInput函數
??? remote()->transact(GET_INPUT, data, &reply);
[cpp]?view plaincopy
AudioPolicyService::getInput
?->
AudioPolicyManagerBase::getInput
??? mpClientInterface->openInput
?->
AudioPolicyService::openInput
?->
BpAudioFlinger的openInput函數
?->
AudioFlinger::openInput
??? mAudioHardware->openInputStream
?->
[cpp]?view plaincopy
alsa_default.cpp
調用s_open函數
[cpp]?view plaincopy
E/AudioHardwareALSA( 1181): openInputStream L314 in->set err = -22
// BAD_VALUE的定義是
BAD_VALUE?????????? = -EINVAL,
#define EINVAL?? ??? ?3
按照以上定義,BAD_VALUE的值應該是-3,但log輸出的值是-22,很奇怪。
----------------------------------------------------------------------------------
二.錄音start函數的處理流程
1.如果是錄像,則錄像中的音頻錄制的調用順序是:
MPEG4Writer::start
->
MPEG4Writer::startWriterThread()
->
MPEG4Writer::startTracks
->
MPEG4Writer::Track::start
->
錄像時,video track是CameraSource,即調用CameraSource::start函數
audio track是AMRNBEncoder,即調用AMRNBEncoder::start函數
->
2.如果是單純的錄音操作,則直接走下面的路程:
AudioSource::start
->
AudioRecord::start()
->
IAudioRecord::start()
如果返回值為DEAD_OBJECT,則調用
->
AudioRecord::openRecord
? ->
? AudioFlinger::openRecord
? ->
? 返回RecordHandle對象
? ->
? AudioFlinger::RecordHandle::start()
? ->
? AudioFlinger::RecordThread::start
? ->
? AudioSystem::startInput(mId);
? ->
? AudioPolicyService::startInput
? ->
? AudioPolicyManagerBase::startInput
如果AudioRecord::openRecord返回NO_ERROR,則繼續調用IAudioRecord::start()
如果IAudioRecord::start()返回NO_ERROR,則啟動ClientRecordThread線程。
----------------------------------------------------------------------------------
三.AudioRecord開始錄音的處理流程
1.frameworks\base\media\java\android\media\AudioRecord.java文件中的
startRecording()函數
[cpp]?view plaincopy
2.native_start對應frameworks\base\core\jni\android_media_AudioRecord.cpp文件中的
android_media_AudioRecord_start 函數
取得AudioRecord對象lpRecorder,然后調用lpRecorder->start()的函數,開始錄音
->
3.frameworks\base\media\libmedia\AudioRecord.cpp文件的
AudioRecord::start()函數
3.1 取得ClientRecordThread對象t
3.2 調用IAudioRecord對象mAudioRecord->start()
(1)如果返回DEAD_OBJECT,則執行AudioRecord::openRecord函數,調用IAudioFlinger的openRecord函數打開錄音設備,然后再執行mAudioRecord->start()開始錄音
原文地址;?http://blog.csdn.net/ameyume/article/details/7794953
總結
以上是生活随笔為你收集整理的AudioRecorder 录音相关的处理流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android MediaRecorde
- 下一篇: Example: Communicati