Android Audio 資料流詳解

來源:互聯網
上載者:User

 Android Audio Architecture 圖如下所示

 

詳細調用路徑如下

1. 音頻播放
範例程式碼
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(PATH_TO_FILE);
mp.prepare();
mp.start();

 

1.1 MediaPlayer mp = new MediaPlayer()

實現流程如下表:

函數名 檔案名稱
MediaPlayer:: MediaPlayer MediaPlayer.Java
MediaPlayer::native_setup MediaPlayer.Java
android_media_MediaPlayer_native_setup android_media_MediaPlayer.cpp
MediaPlayer::MediaPlayer MediaPlayer.cpp

 

1.2 mp.setDataSource(PATH_TO_FILE);

實現流程如下:

函數名 檔案名稱
MediaPlayer::setDataSource MediaPlayer.Java
android_media_MediaPlayer_setDataSource android_media_MediaPlayer.cpp
MediaPlayer::setDataSource

MediaPlayer.cpp

   -MediaPlayer::getMediaPlayerService MediaPlayer.cpp
   -IMediaPlayerService IMediaPlayerService.h
   -IMediaPlayerService::create MediaPlayer.cpp
       --MediaPlayerService::create MediaPlayerService.cpp
   -IMediaPlayer::setDataSource MediaPlayer.cpp
      --BpMediaPlayer::setDataSource IMediaPlayer.cpp
          --MediaPlayerService::Client::setDataSource(真正執行操作) MediaPlayerService.cpp
             --android::createPlayer MediaPlayerService.cpp
                    -- new StagefrightPlayer MediaPlayerService.cpp
            --new AudioOutput MediaPlayerService.cpp
           --StagefrightPlayer::setDataSource StagefrightPlayer.cpp
              --AwesomePlayer::setDataSource AwesomePlayer.cpp
                  --AwesomePlayer::setDataSource_l AwesomePlayer.cpp

 

1.3 mp.prepare() 

函數名 檔案名稱
MediaPlayer:: prepare MediaPlayer.Java
 android_media_MediaPlayer_prepare android_media_MediaPlayer.cpp
MediaPlayer:: prepare MediaPlayer.cpp
    MidiFile:: prepare MidiFile.cpp
    VorbisPlayer:: prepare  VorbisPlayer.cpp
          VorbisPlayer::createOutputTrack VorbisPlayer.cpp
               AudioOutput::open MediaPlayerService.cpp
                  AudioTrack::AudioTrack AudioTrack.cpp
                       AudioSystem::get_audio_flinger AudioSystem.cpp
                       AudioFlinger::createTrack AudioFlinger.cpp
   
   

 

1.4 mp.start()

函數名 檔案名稱
MediaPlayer:: start MediaPlayer.Java
android_media_MediaPlayer_start android_media_MediaPlayer.cpp
MediaPlayer::start MediaPlayer.cpp
   PVPlayer:: start PVPlayer.h
   MidiFile:: start MidiFile.cpp
   VorbisPlayer:: start VorbisPlayer.cpp
       AudioTrack::start AudioTrack.cpp

MediaPlayerService:: MediaPlayerService(MediaPlayerService.cpp)由systemserver進程建立,在檔案system_init.cpp裡的函數system_init()調用MediaPlayerService::instantiate建立

getPlayerType(MediaPlayerService.cpp)返回3種player:
1) PV_PLAYER:播放mp3
2) SONIVOX_PLAYER:播放midi
3) VORBIS_PLAYER:播放ogg,

 

簡單說來,播放流程如下:
Java端發起調用,MediaPlayer會轉至MediaPlayerService,然後會調用相應的解碼工具解碼後建立AudioTrack,所有待輸出的AudioTrack在AudioFlinger::AudioMixer裡合成,然後通過AudioHAL(AudioHardwareInterface的實際實現者)傳至實際的硬體來實現播放


 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.