Android

ExoPlayerの最も単純な使用例で動画再生をする

More than 1 year has passed since last update.

※この記事はExoPlayerのバージョンr1.5.12を元に書かれています。
※先日公開された2.xとは実装方法が異なります。

ExoPlayerについて

MediaPlayerの拡張版としてExoPlayerというGoogle製のライブラリがあります。YouTubeやTwitter、AbemaTVなど著名なアプリで既に実用されており、動画再生において重要な役割を果たしています。

公式でdemoアプリが用意されていますが、こちらは(嬉しいことに)サンプルとして充実しすぎているため、初見では理解に時間がかかります。
demoアプリを読む前の入門として、最も単純な使用例で動画再生する方法を知っておきましょう。

ExoPlayerについて詳しくはこちらの記事にあるリンク先を参考にしてください。
[メモ] ExoPlayer - 新しいAndroidのメディアプレイヤー - Qiita

ExoPlayerの最も単純な使用例

ここではmp4動画のストリーミング再生を行う例を紹介します。

public class MainActivity extends Activity {

    private static final int BUFFER_SEGMENT_SIZE = 64 * 1024;
    private static final int BUFFER_SEGMENT_COUNT = 256;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surface_view);

        String url = "http://html5demos.com/assets/dizzy.mp4";
        Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE);
        DataSource dataSource = new DefaultUriDataSource(this, "userAgent");
        SampleSource sampleSource = new ExtractorSampleSource(
                Uri.parse(url), dataSource, allocator, BUFFER_SEGMENT_COUNT * BUFFER_SEGMENT_SIZE);
        TrackRenderer videoRenderer = new MediaCodecVideoTrackRenderer(
                this, sampleSource, MediaCodecSelector.DEFAULT, MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT);
        TrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(
                sampleSource, MediaCodecSelector.DEFAULT);
        TrackRenderer[] rendererArray = {videoRenderer, audioRenderer};

        ExoPlayer exoPlayer = ExoPlayer.Factory.newInstance(rendererArray.length);
        exoPlayer.prepare(rendererArray);
        exoPlayer.sendMessage(videoRenderer, MediaCodecVideoTrackRenderer.MSG_SET_SURFACE, surfaceView.getHolder().getSurface());
        exoPlayer.setPlayWhenReady(true);
    }
}

ExoPlayerは様々な再生形式に対応できますが、ExtractorSampleSourceを使うと最もベーシックなmp4のストリーミング再生が可能です。
この設定値などはdemoアプリのExtractorRendererBuilderを参考にしています。

このコードを含んだプロジェクトはこちらに置いておきます。
ExoPlayerSample

※これはあくまでdemoアプリを理解するための必要最低限の実装です。実際はライフサイクルに合わせてplayerやsurfaceViewの開放作業などすべきです。その辺りはdemoを参考にしましょう。

MediaPlayerの最も単純な使用例

ついでにMediaPlayerの最も単純な使用例を振り返ってみましょう。

MediaPlayer mediaPlayer = MediaPlayer.create(this, Uri.parse(url), surfaceView.getHolder());
mediaPlayer.start();

厳密にはSurfaceHolder#addCallback(...)が必要ですが、こうして比べるとExoPlayerはだいぶ複雑ですね。
そもそもMediaPlayerで動画再生するならVideoViewを使う事のほうが多いかもしれません。

ExoPlayerの最も単純な使用例(公式)

公式でもいくつか単純な使用例が紹介されていますが、実装において情報が足りなかったり古かったりします。一応紹介します。

ExoPlayer Developerガイド

http://google.github.io/ExoPlayer/guide.html#traditional-media-playbacks
DeveloperガイドにTraditionalなサンプルとして載っています。
これだけだとどんな値でどんな風に組み込むのか分かりません。demo見てって書いてありますけども軽い気持ちでdemo見ると心折れそう。

GitHub Issue

https://github.com/google/ExoPlayer/issues/383
ミニマルなサンプルも提供しようぜ的なissueも上がってますが、今後大きく変更が入るようで、中の人の意向により保留になってます。今後はもっと簡単に導入できるようになりそうですね。
ちなみにこのissueで書いてあるコードはr1.5.8以降では動きません。

YouTube

https://youtu.be/6VjF638VObA?t=392
おそらく最も古いExoPlayerの使用例です。ここで紹介されているFrameworkSampleSourcer1.5.8以降ではDeprecatedになり、正しく動きません。

今後

ExoPlayerは2週間に1回くらいバージョンアップがあり、毎回大きめの変更が入るため、そのうち上記コードでは動かなくなる可能性が大いにあります。ご了承ください。
本記事とExoPlayerSampleでは私の気力の続く限り更新していきたいと思います。
→2.xは私も未知なので本記事の更新はもう行わない予定です。

現場からは以上です。