日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AudioRecorder 录音相关的处理流程

發布時間:2025/3/15 编程问答 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()

    (1)如果返回DEAD_OBJECT,則執行AudioRecord::openRecord函數,調用IAudioFlinger的openRecord函數打開錄音設備,然后再執行mAudioRecord->start()開始錄音

    原文地址;?http://blog.csdn.net/ameyume/article/details/7794953

    總結

    以上是生活随笔為你收集整理的AudioRecorder 录音相关的处理流程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。