Android MediaPlayer に関するメモ

Android で音楽や動画を再生するときに必要な MediaPlayer だけど、直に JNI に処理を吸い込まれていってデバッグしづらいので、 AOSP ネイティブ実装を追い掛けてみた。

TP Vision の資料 (以下の図) がわかりやすすぎて、あんま調べる意味がなかった感じもする。

Android builders summit - The Android media framework (PDF)

Application

JNI

libmedia

media/libmedia - platform/frameworks/av - Git at Google

MediaPlayerService

libmedia で ServiceManager 経由で呼び出された "media.player" サービスは libmediaplayerservice に実体がある。

libmediaservice (MediaPlayerService)

media/libmediaplayerservice - platform/frameworks/av - Git at Google

libstagefright (Stagefrihgt)

Stagefright の役割はだいたい以下のような感じ、パースとレンダリングをやって、デコード処理とかは OMX (OpenMAX) を通じてハードウェアにやらせている。

Integrating a Hardware Video Codec into Android Stagefright using OpenMAX IL (PDF)

AwesomePlayer#prepareAsync

NuPlayer

media/libmediaplayerservice/nuplayer - platform/frameworks/av - Git at Google

用語集

  • Stagefright
    • 脆弱性で話題の Stagefright
  • AwesomePlayer
    • Stagefright のプレイヤーの名前
  • NuPlayer
    • ストリーミング用のプレイヤーの名前
    • Lollipop から、ストリーミング以外の部分もやろうとしている (Stagefright 置き換え?)
  • OMX / Open MAX
    • Khronos Group が策定しているメディア API
  • Bellagio
  • Widevine
    • Google の DRM
  • HLS / Http Live Streaming
    • HTTP 越しにメディアを再生するやつ
    • Apple が m3u というプレイリストフォーマットを魔改造して作ったもの

参考リンク

所感

  • メディア再生の仕組みを調べたいのに脆弱性ばかりでてくる
  • まだまだ調べ切れてないので、もっとソース読んでいきたい

追記 (2015/9/15)

Git の参照しているブランチが master だったので MediaPlayer まわりにコミットがあるとだんだんこの解説と乖離してしまいそう。ということで、 2015/9/15 現在で最新の android-5.1.1_r18 というタグに変更した。