MultiMedia (Android 4.3 API)
なんかちゃんと読んでみるといろいろ進化してますね。
Multimedia
MediaExtractor and MediaCodec enhancements
新しいAndroidは、ISO/IEC 23009-1 に応じた、Dynamic Adaptive Streaming over HTTP (DASH) プレーヤーを、既存のMediaCodecとMdediaExtractorのAPIを使って簡単に実装できるようになっている。
これらのAPIの基礎のフレームワークは、断片化されたMP4ファイルを解析するために更新されたが、あなたのアプリは依然としてMPDメタデータを解析し、MediaExtractorに個々のデータを渡さなければならない。
暗号化されたコンテンツでDASHを利用するなら、getSampleCryptoInfo()メソッドが、個々の暗号化されたメディアサンプルの構造を示す MediaCodec.CryptoInfoメタデータを返す事に注意すること。
また、DASHメディアのPSSHメタデータにアクセスするために、MediaExtractorに
getPsshInfo()メソッドが追加されている。このメソッドは暗号化方式を指定するUUIDと、固有のデータをMapで返す。
Media DRM
新しいMediaDrmクラスは、あなたのメディアに、コンテンツとは分離された、著作権保護のためのDRMシステムを提供する。
この分離によって、Widevineフォーマットを使わずに、Widevineで暗号化されたコンテンツの再生が可能となる。また、このDRMソリューションは、様々なストリーミングコンテンツで利用できるように DASH Common Encryptionもサポートしている。
MediaDrmは、ライセンスサーバーへのキーのリクエストと応答のメッセージを取得するために使用する。MediaDrmが提供するのはメッセージの生成と処理の機能だけで、サーバーとのやりとりはアプリ側で行う必要がある。
MediaDrm APIは、4.1(API Level16)で導入されたMediaCodec APIと組み合わせての使用が前提で、MediaCodecはコンテンツのエンコードとデコード、MediaCryptoは暗号化されたコンテンツの処理、MediaExtractorはコンテンツの展開とdemuxを行う。
最初にMediaExtractorとMediaCodecオブジェクトを生成し、次にコンテンツのmetadataで指定されたDRMスキームのUUIDを入手。それを使ってMediaDrmを生成する手順となる。
Video encoding from a Surface
Android 4.1(API level 16)で、コンテンツのlow-levelのエンコードとデコードを行うためのMediaCodecが導入された。。
動画をエンコードする際、Android 4.1ではバイト列のバッファを必要としたが、4.3ではSurfaceを利用できるようになる。
例えば、既存の動画やOpenGL ESで生成したフレームをソースとしてエンコードが可能。
Surfaceを入力として利用するためには、最初に MediaCodecのconfigure()を呼び、次にメディアストリーム上で内容を受信するためにcreateInputSurface()を呼んでSurfaceを作成する。 例えば、このSurfaceをOpenGLのeglCreateWindowSurface()へ渡し、surfaceが描画されている間に、frameをMediaCodecへ送信するためにeglSwapBuffers()を呼ぶこともできる。
エンコードを開始するにはMediaCodecのstart()を呼び、それらが終わったらエンコードを終了させるためにsignalEndOfInputStream()を呼び、その後Surfaceをrelease()で解放する。
Media muxing
新しいMediaMuxerクラスは、audioとvideoストリームを多重化させるもので、Android 4.2で追加された逆多重化(demux)を行うためのMediaExtractorと対になる機能を提供する。
出力可能なフォーマットは、MediaMuxer.OutputFormatで定義されており、現在はMP4のみで、同時に扱えるのはaudioストリーム一つとvideoストリーム一つだけとなっている。
MediaMuxerは、主にMediaCodecと共に働くよう設計されており、MediaCodecで処理したものをMediaMuxerを通してMP4ファイルへ保存することができる。 また、MediaMuxerとMediaExtractorを組み合わせて、再エンコードすることなくメディアを編集することも可能となる。
Playback progress and scrubbing for RemoteControlClient
Android 4.0(API level 14)では、RemoteControlClientが追加され、ロックスクリーンでも利用できるような、リモートでのmediaの再生のコントロールが可能となった。
Android 4.3では、再生中の位置を変更できるようなコントロールが提供される。 RemoteControlClient APIを使うことで、2つの新しいインターフェースの利用が可能となる。
- これらのインターフェースを利用するには、FLAG_KEY_MEDIA_POSITION_UPDATEをsetTransportControlsFlags()で指定しておかなければならない。
RemoteControlClient.OnGetPlaybackPositionListener
onGetPlaybackPosition()を含み、リモートコントロールがメディアの現在位置を更新する必要がある場合に呼ばれる。
RemoteControlClient.OnPlaybackPositionUpdateListener
onPlaybackPositionUpdate()を含み、ユーザーがUIを操作して再生位置を変更した場合に呼ばれる。 再生を新しい位置へ変更したら、新しい状態や位置、再生速度を示すためにsetPlaybackState()を呼ぶ。
これらのリスナーは、RemoteControlClientのsetOnGetPlaybackPositionListener()とsetPlaybackPositionUpdateListener()でセットする。
動画の仕組みはエンコ職人並の知識しかないので用語の意味が不明なものもあったりするのですが、OpenGLのSurfaceをそのまま入力ソースとして動画にできるらしいってのはわかりました。MediaRecorderでの録画は細かい調整がやりにくかったりするし、これからはNDKでffmpegのライブラリを使用しなくても動画生成がやりやすくなるって理解でいいんでしょうか?