#68 最近使ったライブラリその1 & ExoPlayer

どうも、esuiです。
寒い日が続きますね。位置情報ゲーマーとしてはなかなかつらい季節です。。




最近使ったライブラリその1



本日の1本目は、iOSアプリ開発において最近使ったライブラリの紹介でした(その1)。
5本ほどあるのでさらっと紹介。

Cartography


https://github.com/robb/Cartography
Auto Layoutをコードで書く場合の面倒くさい記述を楽にしてくれるライブラリ。
- ★4,966
- CocoaPods,Carthage対応
- Swift 3対応
- iOS 8.0 +
他に有名なのはSnapKitがあるそうです。

SpringIndicator


スクリーンショット 2016-12-18 00.44.11.png
- https://github.com/KyoheiG3/SpringIndicator
- ★192
- CocoaPods,Carthage対応
- Swift 3対応
- iOS 8.0 +
マテリアルデザインなインジケーター。
Pull to Refreshにも利用可能とのことです。

PagingMenuController


スクリーンショット 2016-12-18 00.46.10.png
https://github.com/kitasuke/PagingMenuController
- ★1,496
- CocoaPods,Carthage対応
- Swift 3対応
- iOS 9.0 + (iOS 8以上はv1.4.0)
ページ上部のタブをスワイプで切り替え可能なメニューを簡単に組み込めるもの。
作者がメルカリの方で、メルカリやTRILLなどで使われているとのことです。

SlideMenuControllerSwift


スクリーンショット 2016-12-18 00.52.56.png
https://github.com/dekatotoro/SlideMenuControllerSwift
サイドメニューが簡単に実装できるライブラリ。
- ★2,079
- CocoaPods,Carthage対応
- Swift 3対応
- iOS 8.0 +

Kingfisher


https://github.com/onevcat/Kingfisher
画像のキャッシュライブラリ、SDWebImageのSwift版みたいなもの。
- ★6,560
- CocoaPods,Carthage対応
- Swift 3対応
- iOS 8.0 +
UIImageView, NSImage, UIButtonに対応

以上、5つほど紹介されていました。
ライブラリの選定基準はどのようにしているのかというと、
- よく使われているか
- ちゃんとメンテされているか
- 安定しているか
というところのようですが、結局はviewの部分などは鉄板のものが無かったりするため、
結局は案件毎に要件を見て選定するようにしています、とのことでした。




ExoPlayer



2本目は、Androidの動画プレイヤー「ExoPlayer」について。

動画再生案件について


ちょっと書いて良いのか微妙な点も多いのですが、まぁとりあえず書ける範囲で。。
そもそも何故ExoPlayerなのか、というと某受託案件において動画再生を実装しなければならない事になったそうです。
が、発表者によると、まず「動画再生」を安易に考えるのはやめるべき、とのことです。
理由としてはみんながやることではないので、ノウハウが転がっておらず、検証するところからになって時間がかかる+見た目の調整が大変+受託で融通が利かないので非常に大変なことになる、とのことでした。

動画再生はナレッジの蓄積が要なので、付け焼き刃だと太刀打ちできず、
「ただ再生する」ために何故こういう処理が必要なのか、なぜこうなるのかが正しく理解されないと不具合を生みやすい問題があり、もしそれでもやるというなら余裕を持った納期設定をすべき、と強調されていました。

google/ExoPlayer


さて話はExoPlayerに戻りますが、ExoPlayerはGoogle製のオープンソースライブラリで、YouTubeやTwitterなどでも使用されているそうです.
"An extensible media player for Android"
AndroidにはMediaPlayerクラスがあり、HLSやDASH(後述)にも対応しているが、「組み込み」であるため更新に問題を抱えていたそうです。
MediaPlayerはC或いはC++で書かれており(Stagefright / NuPlayer)、何かあったときの対応が難しいが、
ExoPlayerは全てJavaで実装されているためJavaの流儀で書き換え可能、とのことです。

HLS(HTTP Live Streaming)


HLSはアップルによって開発された動画をストリーミングするための技術です。
以下のような特徴があります。
- 専用サーバー不要のためCDNとの相性も良い
- ライブもオンデマンドもOK
- 代替ストリーム(モバイル回線用とか)
- 帯域に応じたストリームの切り替え = Adaptive Streaming
- HTTPSを用いたメディアの暗号化とユーザー認証
m3u8形式のプレイリスト内に、動画セグメント(元動画から10秒程度ずつに細切れになっている)の参照とタグを持たせてあります。
スクリーンショット 2016-12-11 19.43.20.png

DASH(Dynamic Adaptive Streaming over HTTP)


DASHはMPEGが策定した動画配信技術。ISO/IEC 23009-1:2012
- MPD(Media Presentation Description)というファイル(中身はXML)でセグメントファイルを管理する
- セグメントはTS或いはFragmented MP4
- DASHでないと使用できないDRMがあったりするらしい
- HLS同様に普通のHTTPサーバで実現可能、CDNも可

HLS vs DASH …?


さて、似たような2つのフォーマットですが、結局何を使えばいいのでしょうか。
AppleはHLS使えと言っています。
https://developer.apple.com/app-store/review/guidelines/
の 2.5.7
- モバイルデバイス(iOS/Android)対応状況はHLSが強い
- HLSはDRM周りが弱い(選択肢の幅が狭い=コストを削減しづらい)
- DASHにはNetflixなども加入している為つよい
- DASHにappleは入ってないが、HLSでMP4を可とするなど、歩み寄りの姿勢が見える
という状況のようです。

ExoPlayer


さて、ExoPlayerの実装に戻りまして。
ExoPlayerインスタンス初期化までに登場する役者が多いのですが、
`Simple`や`Default`と書かれているクラスを渡していくと多くのケースで問題なく動作するそうです。
Viewとの結合も、SimpleExoPlayerView#setPlayer(SimpleExoPlayer)するだけでOK
スクリーンショット 2016-12-11 20.05.49.png

が、`Simple`とか`Easy`、`Awesome`などと付くものは、たいてい柔軟性を犠牲にしているところがあり、
SimpleExoPlayerViewもその例に漏れず、受託案件にありがちな「お絵かきマン デザイナーが夢と希望を詰め込んだUI」をたやすく実現することは難しい、との。
某案件でもUI関連は苦労したそうです。。

MediaSource


ExoPlayerではMediaSourceというクラスがとても重要だそうです。

- ExoPlayerは以下クラスでメディアを抽象化している。
ExtractorMediaSource, HlsMediaSource, DashMediaSource, SsMediaSource, (SingleSampleMediaSource)

- 複数メディアを扱う上で便利なクラスを組み合わせる
ConcatenatingMediaSource, MergingMediaSource, LoopingMediaSource

- 例: MPEG-DASH に WebVTT(字幕) を組み合わせる
DashMediaSource と SingleSampleMediaSource を MergingMediaSourceに与える

- MediaSource内にはTimelineクラスが1つ存在する。
- Timeline内にはWindowとPeriodが1つ〜複数個は存在する。
- Timelineは再生可能なメディアを表している。
- Periodはメディアを示している(CM、ストリーミング)。
- Windowは再生可能な領域を示していて、シークの可否などを扱う。
他にも、
- 帯域制御を行うクラスはどうなってるのか
- ExtractorMediaSourceでメディアの特定はどうなっているのか
- シーク可否を制御するにはどうするのか

…などなど、全く動画再生知識の無い自分にはついていけてないですが、このあたりを理解しないと満足なPrev/Next制御などはできないそうです。。

まとめ


ということで、発表のまとめとして。

- 受託で複雑な動画案件をさせるべきではない
- ExoPlayerは現在のAndroidアプリ開発でのマルチメディア再生における唯一解のためある程度知っておく必要がある
- 受託で複雑な動画案件をさせるべきではない
- Brightcoveなどの大手がExoPlayerをカスタムしたSDKを提供していたりするので、「知らないでは済まされない」のかも知れません
- 受託で複雑な動画案件をさせるべきではない

…この動画案件に対して様々な思いが交差している感が伝わってまいりました…w

この記事へのコメント