Androidと
マルチメディア
  日本Androidの会 8月定例会
法政大学 情報科学研究科 松本 達弥
自己紹介
•        松本達弥 (Twitter:@tmash06)

•   法政大学 情報科学研究科 M1

•   今までやってきたこと

    •    ゲーム向け音声・映像ミドルウェアのAndroidへの移植

    •    VoIPアプリの制作

    •    音声合成ミドルウェアの初期移植

    •    群馬県館林市センサーネットワーク実験 クライアント制作

    •    etc...
宣伝




•   5ヶ月前にAndroid NDKの本を出版しました。
今日のテーマ

  Androidの
マルチメディア機能
マルチメディア機能を使ったアプリ




 音楽プレイヤ                        映像プレイヤ




 VoIPアプリ                               録音
    引用:GooglePlay https://play.google.com/
利用出来るクラス・API
• 大体がandroid.mediaパッケージ
  • MediaPlayer    • OpenSL|ES
  • MediaRecorder • OpenMAX|AL
  • SoundPool      • Camera
  • AudioTrack     • ThumnailUtils
  • AudioRecord    • etc...
 どれを使えばいい・・・?
アジェンダ

• Androidのメディア機能について
• Low Media API
• トラブル時の対応
• まとめ
Androidで再生/録画出来る形式




 • Android Developers:
   Android Supported Media Formats
 • ここに載っている形式 + 各機種独自対応
Androidで再生/録画出来る
                    代表的な形式
コーデック            エンコーダ   デコーダ          備考


      MP3                 ⃝     8∼320kbps CBR/VBR


     Vorbis               ⃝


    H.264 AVC       ⃝※    ⃝       Baseline Profile


      VP8                 ⃝


•     ※Honeycomb(3.0)∼

•     OSバージョンによっても違う

     •   開発時にターゲットとするOSバージョンを決めることが重要
普通に音楽/映像を
      再生したい
例:音楽プレイヤ・動画プレイヤ・ゲームのBGM
MediaPlayer
•   大体のことがコレで事足りる

    •   動画プレイヤー、音楽プレイヤー、
        操作紹介ビデオの再生、etc...

•   動画・音楽対応しているものなら、
    なんでも再生可能

•   ストリーミング再生も可能

•   ただし、単純再生しか出来ない

    •   再生・停止・一時停止・・・
普通に録音/録画がしたい
  例:録音・録画アプリ
MediaRecorder
•   カメラやマイクから映像や音声を記録し、
    エンコードして保存

•   録画・録音しながら、何か効果を与えるなどは不可

    •   SEを入れる

    •   映像にポップを入れる

•   Android OS 1.0∼
短い音を低負荷/低レイテンシ
    に再生したい
   例:ゲームの効果音など
SoundPool
•   短い音の再生するときに利用

•   ゲームのSE向け

•   ロード時にデコードしておく

    •   再生時の負荷が低い

    •   レイテンシ(遅延)が少し小さい

•   メモリ使用量が多い
基本はこの3つ
•   MediaPlayer
•   MediaRecorder
•   SoundPool
•   コレを使えば、大体のアプリはなんとかなる

    •   音楽プレイヤー、録音アプリ、簡単なゲーム、etc...

•   が、ちょっと凝ったことをやろうとすると、
    コレより先に紹介するAPIが必要

    •   本格的な楽器アプリ

    •   VoIP etc...
任意のPCM波形を再生したい
 例:楽器アプリ・VoIPアプリなど
AudioTrack
•   任意のPCM波形を再生

•   2つのモード

    •   Staticモード

        •   決まった波形を何回も再生する時

    •   Steramモード

        •   その時に応じた任意の波形を再生する時

        •   バッファリングとレイテンシの管理が難しい

•   Cupcake(1.5)∼
任意のPCM波形を録音したい
例:凝った録音アプリ・VoIPアプリなど
AudioRecord
• マイクなどから入力されたPCM波形を
  取得可能

• 定期的に録音用バッファから取得しな
  いと、音が飛ぶので注意

• Cupcake(1.5)∼
ネイティブコードから
 オーディオを扱いたい
例:既存のゲーム/ミドルウェアの移植
OpenSL|ES
•   ネイティブ向けオーディオAPI

•   ネイティブコードで書かれた、
    既存のソフト・ミドルウェアを移植するときに

•   持っている機能は、
    MediaPlayer + MediaRecorder + AudioTrack + AudioRecord = 万能

•   使いづらい&資料が少ない

•   Gingerbread(2.3∼)
ネイティブからMPEG2-TS形式を
        扱いたい
例:自前DRM機能付き動画プレイヤ・ワンセグ?
OpenMAX AL
•   マルチメディアストリームを扱うAPI

•   MPEG2-TS(H.264 baseprofile + AAC)のみ対応

•   ストリームを入力する前に任意の処理が可能

    •   DRMなどに向いている

•   ネイティブコードからのみ利用可能

•   資料が少ない

•   ICS(4.0∼)
カメラを使いたい
例:カメラアプリ・AR
Camera
• カメラ機能
• 撮影する機能とプレビュー機能
• プレビュー機能は、任意のSurfaceView
 などへ出力可能

• ARなどをやるときはプレビュー機能
動画などのサムネイル
   を作りたい
例:動画プレイヤでの一覧表示
ThumbnailUtils
• サムネイルを作るときに便利な機能
• 例:動画のサムネイル画像を作成し
 て、ユーザに選択させる

• Froyo(2.2)∼
• 地味に新し目なので注意
リアルタイムに動画や
カメラプレビューにエフェクトをかけたい
       例:???
SurfaceTexture
• 動画/カメラのプレビューを,
  OpenGL|ES 2.0のテクスチャとして
  扱える

• シェーダで映像にリアルタイムにエ
  フェクトなどを与えることが出来る

• Honeycomb(3.0)∼
SurfaceTextureの応用例 その1
             ShaderMovie




•   シェーダを使ってリアルタイムに
    映像やカメラプレビューにリアルタイムにエフェクト

•   詳しくは、ABC2012 Springの私のLTを参考にしていただ
    ければ・・・
SurfaceTextureの応用例 その2
      全方位動画

        シェーダ




• 同心円状に撮影した全方位動画を
 シェーダでリアルタイムにパノラマ変換
映像/音声を編集して保存したい
  例:動画編集ソフト/DAWソフトなど
編集して保存に必要な機能

• mp4やmp3形式のファイルを開く
• フレーム単位・サンプル単位で読み込む
• 編集
• 再度圧縮して保存
Low Media API
•   JellyBeans(4.1)∼

•   低レベルなメディアAPIにアクセス可能

•   低レベル
    =今までよりも細かい高度なことが出来る
    =単純な操作に使うときは面倒くさい

•   OpenMAX ILの薄いラッパー的なイメージ

•   ネイティブ向けAPIは公開されていない
Low Media APIで出来ること
•   音声/映像のエンコード/デコード

    •   入力も出力もバイナリデータ

    •   柔軟性が高い

•   暗号化にも対応(DRM向け?)

•   端末が対応していれば、
    HWエンコード/デコード
どこに使える?
• 動画・音声編集ソフト
• 圧縮音声への自前エフェクト
• 動画の再生時刻に応じたサムネイル
• 2つの動画の同期再生
• etc...
MediaExtractor
•   マルチメディアデータ(動画・音声ファイル)の構造を解析
•   例:映像の場合以下の情報を取得出来る

    •   映像

        •   mime    : video/avc

        •   幅       : 640

        •   高さ      : 480

    •   音声

        •   コーデック           : audio/aac

        •   サンプリングレート : 44100

        •   チャンネル数          :2
MediaCodec
• 実際にエンコード/デコードする
• データをByteBufferとして入出力
 • 内部では、ネイティブのメモリー領域
  をラップしているだけ

• 音声と映像の同期などは取ってくれない
基本的な利用の流れ
• 1.MediaCodecList、MediaCodecInfoから、
 利用出来るコーデック・プロファイルを取得

• 2.MediaExtractorでデータを解析
 • エンコードの際には不要
• 3.MediaCodecでエンコード・デコード
Low Media APIの問題点

• サンプルがほとんどない
 • 特に映像を扱ったものは見つからない
• 扱うのが非常に難しい
• 対応機種が少なすぎる
音声デコード&再生
•   サンプル作りました

•   メディアフォーマットを解析→デコード→AudioTrack
    を利用して再生

•   どのコーデックが使えるかなどの情報を
    取得可能

•   今日説明すると長いので、githubにて公開

•   http://git.io/SuBQMw
映像デコード&表示
•   こちらもサンプル作りました

•   メディアフォーマットを解析→
    動画を連続したビットマップ画像として表示

•   こちらも今日説明すると長いので、
    githubにて公開

•   http://git.io/SuBQMw
音系APIの共通事項
           レイテンシ問題
•   レイテンシ(遅延)

•   再生しろ!と命令してから、実際にスピーカから
    再生されるまでの時間

•   現在は非常に大きい(機種によっては150ms∼)

    •   iOSは10ms程度

    •   楽器アプリや音ゲーを作るときに大問題

•   JellyBeans(4.1)からは、10ms∼12msぐらいに
    改善されるらしい
突然のエラー
• MediaPlayerを使って再生
• 突然エラー!
• エラーなことは教えてくれるが、理由
 までは教えてくれない

• adb logcat !(ログを見てみる)
のスタックトレース




• mediaserverというプロセスがクラッシュ
mediaserver
•   Androidのメディア機能全般を担当する
    プロセス

•   MediaPlayerなどで再生する時、実際にデコード
    などの処理をしているのはこのプロセス

•   Androidが対応していないコーデックや
    プロファイルのデータを再生しようとした時、
    クラッシュする時がある
どうやって対応するか
•   初めに疑うべきはコーデック

•   特にプロファイルについては要注意

    •   H.264はbaseprofileのみなど・・・

    •   Android Supported Media Formatsをよく読む
        (http://developer.android.com/guide/appendix/media-formats.html)


•   ひと通り調べても分からなければ、
    死んでいる部分のソースを見てみるしか無い(ただしC++)

    •   幸運?なことに、大体Assertionで死ぬので、
        特定はしやすい
Android OSソースの
                ダウンロード
•   時間の都合上省略します

•   OSのビルドは大変だが、ソースコードの
    ダウンロードだけなら、そこまで大変ではない

•   もしくは、ソースコード検索サービスを利用する

    •   「Androidソースコード検索サービス」
        http://tools.oesf.biz/android-4.1.1_r1.0/
libstagefright
• mediaserverが利用しているライブラリ
 のひとつ

 • コンテナの解析
 • エンコード・デコード
• ここが原因の時が多い
MediaExtractor
• ファイルフォーマットなどを解析する
• ファイルが壊れていたり、不正な形式
 だったりすると、ここでクラッシュ

• 比較的読みやすいコードなので、原因
 特定は簡単に出来る
その他
•   StagefrightPlayer
•   AwesomePlayer
•   OpenMAX関連

•   etc...


•   今回は時間がないので省略します。

•   この辺りでクラッシュするときは、コーデックの
    プロファイルが怪しい
まとめ
•   やりたいことに合わせたメディアAPI利用しよう

•   トラブルが起きたときは、mediaserverの
    コードを参考にすると解決のヒントになるかもしれない

•   Low Media APIは、Androidのマルチメディア機能を一つ上のレベ
    ルに上げる

    •   が、まだ本気で使うのは早い?

•   今回は紹介しませんでしたが、ffmpegというライブラリを利用
    する方法もある(難易度は高)
ありがとうございました
github : http://git.io/SuBQMw

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

Editor's Notes

  • #2 \n
  • #3 最初に簡単に自己紹介させて頂きます。\n法政大学 情報科学研究科 修士1年の松本達弥と申します。\nとは言っても、普段はこの小奇麗なキャンパスではなく、三鷹の先のド田舎の小金井というところにいます。\n簡単に今までに私がやってきたことを紹介させて頂きますと、\nCRI・ミドルウェアという会社でのゲーム向け音声・映像ミドルウェアのAndroidへの移植\n面白法人カヤックという会社で、ReengoというFacebookアカウントで通話ができるReengoというアプリの制作\n音声合成ミドルウェアの移植初期調査、日本一暑い街、群馬県館林にセンサーネットワークを張り巡らせて、\n色々やってみようという実験、これは、東京電機大、中央大、東大、気象庁さんなどと一緒にやったプロジェクトなのですが、これのクライアントアプリ制作。\n
  • #4 宣伝です。\n5ヶ月ぐらい前にAndroid NDKの本を出版しました。\nよろしくお願いします!\n
  • #5 で、今日の本題\nAndroidのマルチメディア機能についてなのですが、\n私の今まで携わって来たものが、先程も紹介した通り、マルチメディア関連のアプリが多かったんですね。\nそういった経緯もありまして、結構大学とかで、卒論とかの相談で、Androidで録音したいんだけどどうすればいい?とか、\nファミコンみたいな音を鳴らしたいんだけど、方法がわからないといった相談を受けるんですね。\n\nで、そのたび説明してるんですが、イザ自分でも色々調べてみると、バージョンが上がるごとに機能が増えていって、かなりごちゃごちゃしていると。\n例えば、単に音を鳴らすだけでも何種類もある。\n確かに、これはいきなりAndoridを始めた人がどれを使えばいいかなんて、わかりませんよね。\n\nさらに、かなりAndroidのマルチメディア機能って不親切なんですね。\n例えばエラーが起きても、エラーが起きたことは教えてくれても、なんでエラーが起きたかは教えてくれない。\n\n幸運にも、私はアルバイトなどの都合上、マルチメディアを担当するライブラリlibstagefrightっていう名前なのですが、\nこの内部とかも、若干読んだ経験がありまして、そのおかげでトラブルが起きた時も、結構すぐに理由がわかることができたりするのですが、\nそもそもJavaレイヤーの開発者は、内部のコードを読むことはないわけです。というか、読む必要があるっていうのはかなり不親切な設計だと思うんですが。\nですから、トラブルが起きた時に想像でしかデバッグができないという問題があったりします。\n\nそこで、今日は、Androidのマルチメディア機能について、何をしたい時には、どのクラス・APIを使えばいいのかという話をしたいと思います。\nまた、エラーが起きた時に、ある程度、OSのメディアフレームワークのコードからそれを簡単に推測する方法などを紹介します。\nそして、最後に、JellyBeansから搭載された最新MediaAPIであるLowMediaAPIについて簡単に紹介したいと思います。\n\n
  • #6 \n
  • #7 \n
  • #8 \n
  • #9 \n
  • #10 \n
  • #11 \n
  • #12 \n
  • #13 \n
  • #14 \n
  • #15 \n
  • #16 \n
  • #17 \n
  • #18 \n
  • #19 \n
  • #20 \n
  • #21 \n
  • #22 \n
  • #23 \n
  • #24 \n
  • #25 \n
  • #26 \n
  • #27 \n
  • #28 \n
  • #29 \n
  • #30 \n
  • #31 \n
  • #32 \n
  • #33 \n
  • #34 \n
  • #35 \nPCで動く映像編集ソフトや、波形編集ソフトで編集して保存するのに必要な機能ってなんでしょうか。\n基本的には、Mpeg4とかMP3形式などの圧縮された映像・音声を開いて、\nフレーム、これは、動画の\n
  • #36 \n
  • #37 \n
  • #38 \n
  • #39 \n
  • #40 \n
  • #41 \n
  • #42 \n
  • #43 \n
  • #44 \n
  • #45 \n
  • #46 \n
  • #47 \n
  • #48 \n
  • #49 \n
  • #50 \n
  • #51 \n
  • #52 \n
  • #53 \n
  • #54 \n
  • #55 \n