Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

日本Androidの会発表スライド androidのメディア機能の話

18,928 views

Published on

日本Androidの会 8月定例会での発表スライドです。

  • Be the first to comment

日本Androidの会発表スライド androidのメディア機能の話

  1. 1. Androidとマルチメディア 日本Androidの会 8月定例会法政大学 情報科学研究科 松本 達弥
  2. 2. 自己紹介•  松本達弥 (Twitter:@tmash06)• 法政大学 情報科学研究科 M1• 今までやってきたこと • ゲーム向け音声・映像ミドルウェアのAndroidへの移植 • VoIPアプリの制作 • 音声合成ミドルウェアの初期移植 • 群馬県館林市センサーネットワーク実験 クライアント制作 • etc...
  3. 3. 宣伝• 5ヶ月前にAndroid NDKの本を出版しました。
  4. 4. 今日のテーマ Androidのマルチメディア機能
  5. 5. マルチメディア機能を使ったアプリ 音楽プレイヤ 映像プレイヤ VoIPアプリ 録音 引用:GooglePlay https://play.google.com/
  6. 6. 利用出来るクラス・API• 大体がandroid.mediaパッケージ • MediaPlayer • OpenSL|ES • MediaRecorder • OpenMAX|AL • SoundPool • Camera • AudioTrack • ThumnailUtils • AudioRecord • etc... どれを使えばいい・・・?
  7. 7. アジェンダ• Androidのメディア機能について• Low Media API• トラブル時の対応• まとめ
  8. 8. Androidで再生/録画出来る形式 • Android Developers: Android Supported Media Formats • ここに載っている形式 + 各機種独自対応
  9. 9. Androidで再生/録画出来る 代表的な形式コーデック エンコーダ デコーダ 備考 MP3 ⃝ 8∼320kbps CBR/VBR Vorbis ⃝ H.264 AVC ⃝※ ⃝ Baseline Profile VP8 ⃝• ※Honeycomb(3.0)∼• OSバージョンによっても違う • 開発時にターゲットとするOSバージョンを決めることが重要
  10. 10. 普通に音楽/映像を 再生したい例:音楽プレイヤ・動画プレイヤ・ゲームのBGM
  11. 11. MediaPlayer• 大体のことがコレで事足りる • 動画プレイヤー、音楽プレイヤー、 操作紹介ビデオの再生、etc...• 動画・音楽対応しているものなら、 なんでも再生可能• ストリーミング再生も可能• ただし、単純再生しか出来ない • 再生・停止・一時停止・・・
  12. 12. 普通に録音/録画がしたい 例:録音・録画アプリ
  13. 13. MediaRecorder• カメラやマイクから映像や音声を記録し、 エンコードして保存• 録画・録音しながら、何か効果を与えるなどは不可 • SEを入れる • 映像にポップを入れる• Android OS 1.0∼
  14. 14. 短い音を低負荷/低レイテンシ に再生したい 例:ゲームの効果音など
  15. 15. SoundPool• 短い音の再生するときに利用• ゲームのSE向け• ロード時にデコードしておく • 再生時の負荷が低い • レイテンシ(遅延)が少し小さい• メモリ使用量が多い
  16. 16. 基本はこの3つ• MediaPlayer• MediaRecorder• SoundPool• コレを使えば、大体のアプリはなんとかなる • 音楽プレイヤー、録音アプリ、簡単なゲーム、etc...• が、ちょっと凝ったことをやろうとすると、 コレより先に紹介するAPIが必要 • 本格的な楽器アプリ • VoIP etc...
  17. 17. 任意のPCM波形を再生したい 例:楽器アプリ・VoIPアプリなど
  18. 18. AudioTrack• 任意のPCM波形を再生• 2つのモード • Staticモード • 決まった波形を何回も再生する時 • Steramモード • その時に応じた任意の波形を再生する時 • バッファリングとレイテンシの管理が難しい• Cupcake(1.5)∼
  19. 19. 任意のPCM波形を録音したい例:凝った録音アプリ・VoIPアプリなど
  20. 20. AudioRecord• マイクなどから入力されたPCM波形を 取得可能• 定期的に録音用バッファから取得しな いと、音が飛ぶので注意• Cupcake(1.5)∼
  21. 21. ネイティブコードから オーディオを扱いたい例:既存のゲーム/ミドルウェアの移植
  22. 22. OpenSL|ES• ネイティブ向けオーディオAPI• ネイティブコードで書かれた、 既存のソフト・ミドルウェアを移植するときに• 持っている機能は、 MediaPlayer + MediaRecorder + AudioTrack + AudioRecord = 万能• 使いづらい&資料が少ない• Gingerbread(2.3∼)
  23. 23. ネイティブからMPEG2-TS形式を 扱いたい例:自前DRM機能付き動画プレイヤ・ワンセグ?
  24. 24. OpenMAX AL• マルチメディアストリームを扱うAPI• MPEG2-TS(H.264 baseprofile + AAC)のみ対応• ストリームを入力する前に任意の処理が可能 • DRMなどに向いている• ネイティブコードからのみ利用可能• 資料が少ない• ICS(4.0∼)
  25. 25. カメラを使いたい例:カメラアプリ・AR
  26. 26. Camera• カメラ機能• 撮影する機能とプレビュー機能• プレビュー機能は、任意のSurfaceView などへ出力可能• ARなどをやるときはプレビュー機能
  27. 27. 動画などのサムネイル を作りたい例:動画プレイヤでの一覧表示
  28. 28. ThumbnailUtils• サムネイルを作るときに便利な機能• 例:動画のサムネイル画像を作成し て、ユーザに選択させる• Froyo(2.2)∼• 地味に新し目なので注意
  29. 29. リアルタイムに動画やカメラプレビューにエフェクトをかけたい 例:???
  30. 30. SurfaceTexture• 動画/カメラのプレビューを, OpenGL|ES 2.0のテクスチャとして 扱える• シェーダで映像にリアルタイムにエ フェクトなどを与えることが出来る• Honeycomb(3.0)∼
  31. 31. SurfaceTextureの応用例 その1 ShaderMovie• シェーダを使ってリアルタイムに 映像やカメラプレビューにリアルタイムにエフェクト• 詳しくは、ABC2012 Springの私のLTを参考にしていただ ければ・・・
  32. 32. SurfaceTextureの応用例 その2 全方位動画 シェーダ• 同心円状に撮影した全方位動画を シェーダでリアルタイムにパノラマ変換
  33. 33. 映像/音声を編集して保存したい 例:動画編集ソフト/DAWソフトなど
  34. 34. 編集して保存に必要な機能• mp4やmp3形式のファイルを開く• フレーム単位・サンプル単位で読み込む• 編集• 再度圧縮して保存
  35. 35. Low Media API• JellyBeans(4.1)∼• 低レベルなメディアAPIにアクセス可能• 低レベル =今までよりも細かい高度なことが出来る =単純な操作に使うときは面倒くさい• OpenMAX ILの薄いラッパー的なイメージ• ネイティブ向けAPIは公開されていない
  36. 36. Low Media APIで出来ること• 音声/映像のエンコード/デコード • 入力も出力もバイナリデータ • 柔軟性が高い• 暗号化にも対応(DRM向け?)• 端末が対応していれば、 HWエンコード/デコード
  37. 37. どこに使える?• 動画・音声編集ソフト• 圧縮音声への自前エフェクト• 動画の再生時刻に応じたサムネイル• 2つの動画の同期再生• etc...
  38. 38. MediaExtractor• マルチメディアデータ(動画・音声ファイル)の構造を解析• 例:映像の場合以下の情報を取得出来る • 映像 • mime : video/avc • 幅 : 640 • 高さ : 480 • 音声 • コーデック : audio/aac • サンプリングレート : 44100 • チャンネル数 :2
  39. 39. MediaCodec• 実際にエンコード/デコードする• データをByteBufferとして入出力 • 内部では、ネイティブのメモリー領域 をラップしているだけ• 音声と映像の同期などは取ってくれない
  40. 40. 基本的な利用の流れ• 1.MediaCodecList、MediaCodecInfoから、 利用出来るコーデック・プロファイルを取得• 2.MediaExtractorでデータを解析 • エンコードの際には不要• 3.MediaCodecでエンコード・デコード
  41. 41. Low Media APIの問題点• サンプルがほとんどない • 特に映像を扱ったものは見つからない• 扱うのが非常に難しい• 対応機種が少なすぎる
  42. 42. 音声デコード&再生• サンプル作りました• メディアフォーマットを解析→デコード→AudioTrack を利用して再生• どのコーデックが使えるかなどの情報を 取得可能• 今日説明すると長いので、githubにて公開• http://git.io/SuBQMw
  43. 43. 映像デコード&表示• こちらもサンプル作りました• メディアフォーマットを解析→ 動画を連続したビットマップ画像として表示• こちらも今日説明すると長いので、 githubにて公開• http://git.io/SuBQMw
  44. 44. 音系APIの共通事項 レイテンシ問題• レイテンシ(遅延)• 再生しろ!と命令してから、実際にスピーカから 再生されるまでの時間• 現在は非常に大きい(機種によっては150ms∼) • iOSは10ms程度 • 楽器アプリや音ゲーを作るときに大問題• JellyBeans(4.1)からは、10ms∼12msぐらいに 改善されるらしい
  45. 45. 突然のエラー• MediaPlayerを使って再生• 突然エラー!• エラーなことは教えてくれるが、理由 までは教えてくれない• adb logcat !(ログを見てみる)
  46. 46. のスタックトレース• mediaserverというプロセスがクラッシュ
  47. 47. mediaserver• Androidのメディア機能全般を担当する プロセス• MediaPlayerなどで再生する時、実際にデコード などの処理をしているのはこのプロセス• Androidが対応していないコーデックや プロファイルのデータを再生しようとした時、 クラッシュする時がある
  48. 48. どうやって対応するか• 初めに疑うべきはコーデック• 特にプロファイルについては要注意 • H.264はbaseprofileのみなど・・・ • Android Supported Media Formatsをよく読む (http://developer.android.com/guide/appendix/media-formats.html)• ひと通り調べても分からなければ、 死んでいる部分のソースを見てみるしか無い(ただしC++) • 幸運?なことに、大体Assertionで死ぬので、 特定はしやすい
  49. 49. Android OSソースの ダウンロード• 時間の都合上省略します• OSのビルドは大変だが、ソースコードの ダウンロードだけなら、そこまで大変ではない• もしくは、ソースコード検索サービスを利用する • 「Androidソースコード検索サービス」 http://tools.oesf.biz/android-4.1.1_r1.0/
  50. 50. libstagefright• mediaserverが利用しているライブラリ のひとつ • コンテナの解析 • エンコード・デコード• ここが原因の時が多い
  51. 51. MediaExtractor• ファイルフォーマットなどを解析する• ファイルが壊れていたり、不正な形式 だったりすると、ここでクラッシュ• 比較的読みやすいコードなので、原因 特定は簡単に出来る
  52. 52. その他• StagefrightPlayer• AwesomePlayer• OpenMAX関連• etc...• 今回は時間がないので省略します。• この辺りでクラッシュするときは、コーデックの プロファイルが怪しい
  53. 53. まとめ• やりたいことに合わせたメディアAPI利用しよう• トラブルが起きたときは、mediaserverの コードを参考にすると解決のヒントになるかもしれない• Low Media APIは、Androidのマルチメディア機能を一つ上のレベ ルに上げる • が、まだ本気で使うのは早い?• 今回は紹介しませんでしたが、ffmpegというライブラリを利用 する方法もある(難易度は高)
  54. 54. ありがとうございましたgithub : http://git.io/SuBQMw

×