Help us understand the problem. What is going on with this article?

Androidの動画プレイヤー「ExoPlayer」との付き合い方

More than 3 years have passed since last update.

ExoPlayerとは

Androidの動画再生用のライブラリで、Googleが提供しており、オープンソースです。

https://github.com/google/ExoPlayer

公式ドキュメントはこちらにあります。
またGoogleIO 2016にもセッションがあるので、動画で見たい方はそちらが良いでしょう。基本的な使い方や、使うメリットなどが解説されています。

本気で使いたい方は公式ドキュメントを読み込み、デモアプリを動かし、そのコードを参考にしながら作り込めば良いでしょう。

本記事では、動画アプリを作るために業務で約1年半このExoPlayerと付き合い続けた一人のAndroidエンジニアのExoPlayerとの付き合い方を紹介したいと思います。

使い方について

クラス数も多く、実際の動画再生までわりとコードを書かないといけませんが、デモアプリや公式ドキュメントが充実しているので、理解は容易いと思います。

その中で特に理解しておくべき事項としてはPlayerStateです。
この状態を受け取るためのコールバックがあるので、再生したい動画フォーマットで実際に動かしてみて、この状態がどのように変化しているか見て理解することが一番重要だと思います。
こうすることでprepareやsetPlayWhenReadyなどを呼ぶと状態がどのように変化して、どのタイミングでbufferingが始まって、再生が始まっているなどが理解できると思います。

exoplayer_playbackstate.png

SurfaceView or TextureView

どちらを使うべきかは公式ドキュメントのFAQに書かれております。
私が作ったアプリはminSdkVersionが16で、かつ、ViewPagerの中で動画を再生する必要があったため、TextureViewを採用することになりました。

コールバックの多様さ

デモアプリのDemoPlayerクラスを見るとコールバック用のインタフェースがたくさんあります。

public class DemoPlayer implements ExoPlayer.Listener, ChunkSampleSource.EventListener,
    HlsSampleSource.EventListener, ExtractorSampleSource.EventListener,
    SingleSampleSource.EventListener, DefaultBandwidthMeter.EventListener,
    MediaCodecVideoTrackRenderer.EventListener, MediaCodecAudioTrackRenderer.EventListener,
    StreamingDrmSessionManager.EventListener, DashChunkSource.EventListener, TextRenderer,
    MetadataRenderer<List<Id3Frame>>, DebugTextViewHelper.Provider

・・・・とにかく、これとうまく付き合っていかないといけません。
クラス名を見ればなんとなくわかりますが、HLSやMPEG-DASHなど、特定のAdaptive-Streamingの場合にしか使わないインタフェースがいくつかあります。まず、特定の場合にしか必要のないものは分離して、共通のものだけ実装するのが良いと思います。
共通のものの中でも、stremingのtimed textやid3metatagのように特定の機能を使わない限り必要のないものもあります。

そうして特定の場合を省いていくと、アプリケーションのビジネスロジック側からはExoPlayer.Listenerさえハンドリングできていれば、再生、停止などの処理、エラー処理などに対応できます。

以上のことに着眼しつつ、DemoPlayerがExoPlayer.Listenerだけを実装するように再設計してPlayerを作ることをおすすめします。

バージョンアップの多さ

ExoPlayerはojw28さんがたった一人で作っているように見えます
にもかかわらず、バージョンアップの頻度がすごく高いです。

彼がよりよい設計を模索し続けているのだと思いますが、バージョンアップごとにコールバックやクラスのコンストラクタといった、外部から呼ぶインタフェースに破壊的変更が入ります。

たとえばデモアプリ内にある、HLSを再生するときに使うHlsRendererBuilderというクラスは中の実装がバージョンアップごとに変更されます。
呼び出すクラスのコンストラクタの引数が増えたり、減ったりします。
v1.5.7->v1.5.8の変更点の中のHlsRendererBuilderなどを眺めていると、クラスのコンストラクタに変更が入っているのがわかります。

この変更とうまく付き合うためには、動画の再生部分とアプリケーションを分離するラッパーを作ることを強くおすすめします。

最近、ExoPlayer用にブログがオープンしました。こちらもたった一人で運用されているように見えますが、今後の変更はこれを追っかければよさそうに思います。

まとめ

以上全てが面倒くさい!、さっさと動画再生したいよ!って方は以下のライブラリをお使いください。
気まぐれなExoPlayerのバージョンアップに1営業日(ベストエフォート)で対応させていただきます。

https://github.com/satorufujiwara/exoplayer-textureview

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away