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

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

## ExoPlayerについて
[MediaPlayer](http://developer.android.com/intl/ja/reference/android/media/MediaPlayer.html)の拡張版として[ExoPlayer](http://developer.android.com/intl/ja/guide/topics/media/exoplayer.html)というGoogle製のライブラリがあります。YouTubeやTwitter、AbemaTVなど著名なアプリで既に実用されており、動画再生において重要な役割を果たしています。

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

ExoPlayerについて詳しくはこちらの記事にあるリンク先を参考にしてください。
[[メモ] ExoPlayer - 新しいAndroidのメディアプレイヤー - Qiita](http://qiita.com/heki1224/items/1357d5e0eab9aff7f4f6)

## ExoPlayerの最も単純な使用例
ここではmp4動画のストリーミング再生を行う例を紹介します。

```java
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](https://github.com/google/ExoPlayer/blob/r1.5.8/demo/src/main/java/com/google/android/exoplayer/demo/player/ExtractorRendererBuilder.java)を参考にしています。

このコードを含んだプロジェクトはこちらに置いておきます。
っ[ExoPlayerSample](https://github.com/ogapants/ExoPlayerSample)

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

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

```java
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の使用例です。ここで紹介されている`FrameworkSampleSource`は`r1.5.8`以降ではDeprecatedになり、正しく動きません。

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

現場からは以上です。