Stagefright入門

5,689 views

Published on

横浜Androidプラットフォーム部第13回勉強会で発表した資料です。

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,689
On SlideShare
0
From Embeds
0
Number of Embeds
33
Actions
Shares
0
Downloads
53
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Stagefright入門

  1. 1. Stagefright 入門 ~ Android Multimedia~ 横浜 Android プラットフォーム部 第13回勉強会 2011/9/19 @ l_b__
  2. 2. Stagefright とは? <ul><li>Gingerbread から採用された動画・音声再生を行うためのメディアプレーヤーフレームワーク
  3. 3. ソース自体は Eclair から入っていたが、正式採用は Gingerbread
  4. 4. 意味は「舞台負け」「気後れ」「舞台あがり」(研究社新英和中辞典より) </li></ul>
  5. 5. MediaPlayer のおさらい <ul><li>基本的な MediaPlayer の使い方(音楽再生)
  6. 6. Uri myUri = ....; // initialize Uri here
  7. 7. MediaPlayer mediaPlayer = new MediaPlayer();
  8. 8. mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
  9. 9. mediaPlayer.setDataSource(getApplicationContext(), myUri);
  10. 10. mediaPlayer.prepare();
  11. 11. mediaPlayer.start(); </li></ul>
  12. 12. MediaPlayer のソースを見る <ul><li>frameworks/base/media 以下がマルチメディア関連のソース。
  13. 13. コアである MediaPlayer.java の実行ステップ数450行! </li></ul>
  14. 14. <ul>MediaPlayer のソース </ul><ul><li>イベント処理を行っているだけでほとんどの機能で Native を呼んでいる。
  15. 15. で、 JNI を通した呼び先が Stagefright。 </li></ul>
  16. 16. Android のマルチメディア史 <ul><li>元々はメディアエンジンとして ffmpeg (http://ffmpeg.org/) を採用する予定だったらしい。
  17. 17. しかし ffmpeg はライセンスに GPL を採用。
  18. 18. しかも... </li></ul>
  19. 19. Hall of Shame
  20. 20. Android のマルチメディア史 <ul><li>ライセンス違反ソフトの晒し上げページを作るほど強硬派。
  21. 21. で、 ffmpeg はあきらめ、他のエンジンを探したらしい。
  22. 22. そして採用されたのが PacketVideo 社の CORE をオープンソース化した OpenCore。
  23. 23. 以後、 Froyo まで/ external/opencore の下に存在。 </li></ul>
  24. 24. OpenCore <ul><li>OpenCoreはプレーヤー部分であるpvPlayerと各Codecから構成。
  25. 25. 開発向けガイドなどのドキュメント類が/external/opencore/doc配下にある。
  26. 26. OpenCoreには一つ面白い特徴が。 </li></ul>
  27. 27. OpenMAX <ul><li>OpenCoreはOpenMAXをサポート。
  28. 28. OpenMAX(http://www.khronos.org/openmax/)とは </li><ul><li>Khronosグループが策定しているポータビリティを重視したクロスプラットフォーム向けのメディアAPI </li></ul></ul>
  29. 29. 余談:Khronosって? <ul><li>様々なオープンスタンダードAPIを策定しているコンソーシアム。
  30. 30. OpenGL,OpenCL,OpenVG,OpenSL,OpenKODE,WebGL,EGL,WebCL,OpenWF etc etc.
  31. 31. OpenAL が Khronos 策定で無いのをさっき知ったのはここだけの話です。 </li></ul>
  32. 32. OpenCoreとOpenMAX <ul><li>OpenCoreがサポートしているのはOpenMAX IL(Integration Layer)
  33. 33. OpenMAXにはDL(Development Layer)、IL、AL(Application Layer)があり、ILはコーデックを叩きやすくするAPIが定義されている。 </li></ul>
  34. 34. OpenMAX IL http://pc.watch.impress.co.jp/docs/2004/0729/kaigai104.htm  から
  35. 35. ここは想像 <ul><li>OpenCoreにスタンダードなエンコード/デコードのAPIが用意されていたので、Java側のAndroidMediaFrameworkに合わせて作り直したのがStagefrightじゃないかなと。
  36. 36. Stagefrightが公開されたのはEclairから。 </li></ul>
  37. 37. 動画再生の基礎 <ul><li>動画はおおざっぱに言うと、パラパラ漫画の絵(フレーム)を1枚ずつどう圧縮し(符号化)、どういう形でファイル/ストリームに格納するか(コンテナ)。
  38. 38. 動画再生はファイル/ストリームからコンテナ形式に従ってフレームを取り出し、デコードして取り出した画像を画面表示すること。 </li></ul>
  39. 39. 動画再生の図 <ul><li>取り出したフレームには </li><ul><li>それだけで復号できる I フレーム
  40. 40. 前の I フレーム/ P フレームを参照して復号する P フレーム
  41. 41. 前後のフレームを参照して復号する B フレーム </li></ul><li>デコーダには I フレームを含む形でフレームを渡す必要がある </li></ul>
  42. 42. 音声再生の基礎 <ul><li>基本はPCM(Pulse Code Modulation)フォーマット。
  43. 43. サンプリング周波数単位で、音圧を変換した量子化ビットを記録したもの。
  44. 44. サンプリング周波数は音声をどの頻度でデータ化するかをHzで表したもの。
  45. 45. 量子化ビット(ビット深度)はどの程度の精度で音圧を記録するか。 </li></ul>
  46. 46. 音声再生の基礎 <ul><li>CDの場合、サンプリング周波数は44.1KHz、量子化ビット数は16bit、ステレオで2ch。
  47. 47. データサイズは1秒辺り44100x2byte(=16bit)x2(ch)=176400byte
  48. 48. このデータをコーデックでエンコード・デコードする。 </li></ul>
  49. 49. で、Stagefrightの話 <ul><li>Stagefrightの機能を簡単に </li><ul><li>アプリから渡されたuriを元にファイル/ストリームを取得
  50. 50. ファイル/ストリームがどのコンテナ形式かをチェックし、対応するDataSource/MediaSourceに格納 </li></ul></ul>
  51. 51. Stagefrightの処理(承前) <ul><ul><li>コンテナからフレームを取り出し(Parser)、OpenMAX ILでデコード
  52. 52. デコードしたフレームをSurface/AudioTrackに設定してSurfaceFlinger/AudioFlingerに渡して再生する(Rendrer) </li></ul></ul>
  53. 53. StageFrightを簡単な図で http://events.linuxfoundation.org/events/embedded-linux-conference/garcia の資料http://elinux.org/images/5/52/Elc2011_garcia.pdfから
  54. 54. Parser処理 <ul><li>ファイル/ストリームデータを格納するMediaSourceクラス及びコンテナタイプ毎のサブクラスからMediaExtractorのコンテナタイプ毎のサブクラスを呼び出して処理。 </li><ul><li>MPEG4の場合、MPEG4SourceとMPEG4Extractor </li></ul></ul>
  55. 55. Parse処理 <ul><li>内部では泥臭くバイナリデータをパース。
  56. 56. フレームのデータを取得しておく。 </li><ul><li>画面サイズ、フレームレート、RGBフォーマット、サンプリングレート、ビット深度等デコード、レンダリングに必要な情報 </li></ul></ul>
  57. 57. デコード処理 <ul><li>OpenMAX IL の API を使ってデコードする。
  58. 58. OpenMAX IL の使い方は Bellagio( http://omxil.sourceforge.net/)が詳しく 、サンプルソースがある。
  59. 59. / external/opencore/doc にある開発ガイドにも説明あり。
  60. 60. 以下 openmax_call_sequences.pdf から抜粋 </li></ul>
  61. 61. OMX Core初期化 <ul><li>OMX_Initで初期化し、使用可能なCodecをコンポーネント名として取得する。
  62. 62. コンポーネント名から機能(何のCodecか)を取得。 </li></ul>
  63. 63. OMXコンポーネント設定 <ul><li>OMXGetHandleでコンポーネントハンドルを取得する。
  64. 64. コンポーネントのパラメータ取得 </li></ul>
  65. 65. OMX入出力バッファ設定 <ul><li>フレームを入力し、デコードされたデータを出力するバッファを設定する。
  66. 66. この後、コンポーネントの状態をLoaded->Idle->Executingにする。 </li></ul>
  67. 67. OMXのポート <ul><li>コンポーネントの入出力ポートを介してデコード前/後のデータをやり取りする。 </li></ul>
  68. 68. OMXデコード処理 <ul><li>バッファにデータを設定した後、 EmptyThisBuffer でデコード開始、 FillThisBuffer でデコードされたデータを取り出し。 </li></ul>
  69. 69. Renderer処理 <ul><li>OMXコンポーネントから取得したデータを出力する。
  70. 70. 画像データは必要ならスケーリング、画像フォーマット(YUV->RGB)変換を行い、Surfaceを使ってSurfaceFlingerで描画。
  71. 71. 音声データはAudioTrackを使ってAudioFlingerで再生。 </li></ul>
  72. 72. http://freepine.blogspot.com/2010/01/overview-of-stagefrighter-player.html Stagefrightの構成図
  73. 73. Stagefrightの構成 <ul><li>緑がDataSource、MediaSourceとMediaExtractor。ファイル/ストリームからフレーム(やメタデータ)をパースする処理部分。
  74. 74. オレンジがOpenMAX ILの実装部分。
  75. 75. 水色がレンダリング処理部分。
  76. 76. 赤が全体を制御する機能部分。 </li></ul>
  77. 77. まとめ <ul><li>Androidのマルチメディア処理はほとんどNativeのStagefrightで行われます。
  78. 78. StagefrightにはOpenMAX DLというオープンスタンダードが使われています。 </li></ul>
  79. 79. 最後に <ul><li>OpenMAX DlのAPIは共有ライブラリとして公開されているので、実は普通にJNIを使ったAndroidアプリから叩けます。
  80. 80. なので、Android標準で対応していないフォーマットの動画・音声も頑張ればHWデコードをサポートした形で自作アプリから再生できます。 </li></ul>以上です。

×