はじめに
こんにちは、GlobeeでCTOをやっています上赤です。
Globee Advent Calendar3日目の記事です。
abceedで英語学習に最適な映画再生体験を作るために、AWS MediaConvertの設定を色々調整しましたので、それについて話します。
英語学習に最適な映画再生体験とは
abceedでは、映画を使って効率的に英語学習を行ってもらうために、様々な機能を付けています。
- 日英同時字幕
- 速度変更
- フレーズ単位の解説語注
- フレーズ単位のシーク/リピート
など、様々なものがありますが、この記事では主にフレーズ単位のシーク/リピートが関わってきます。
フレーズ単位のシーク/リピートのための要件
まず大前提として、フレーズとフレーズの隙間は非常に短く、0.01秒単位で正確にシークできないと、フレーズの開始位置とぴったり合わせることができません。
また、1フレーズの長さは短いものだと1秒ぐらいなので、フレーズリピートをすると最短1秒ごとにシークが行われることになります。この時、シークのレスポンスが悪いと、非常にユーザー体験が悪いです。
例えば、1回のシークに0.1秒かかる場合なら10秒間に8~9回ぐらいリピートできるところが、1回のシークに1秒かかる場合、10秒間に4~5回ぐらいしかリピートできなくなります。
逆に、ある程度大きな秒数でシークする場合は、レスポンスが多少悪くてもそこまでストレスではないです。(これは普通の動画サービスと同じ)
なので、ストリーミング環境下で、0.01秒単位のシークを正確かつレスポンス良くする、というのが他のサービスにはない要件でした。それを踏まえてAWS MediaConvertの設定をどういじったかを紹介します。
具体的な設定
SegmentLength
"SegmentLength": 1
デフォルト値は10秒ですが、そうすると短い範囲でのシークのレスポンスがやや悪かったので、1秒単位でセグメント化しています。
SegmentLengthControl/ManifestDurationFormat
"SegmentLengthControl": "EXACT"
"ManifestDurationFormat": "FLOATING_POINT"
この設定にしないと、アプリ側でのシークが0.1秒単位でずれてしまうことがあったので、厳密なシークができるようにこの設定にしています。
AbrSettings
具体的な設定数値は割愛しますが、一般的な動画サービスよりも若干通信速度に対する画質値を落としています。
リリース後のアンケートで、画質よりもシークのレスポンスを求める人の方が多かった、というのが理由です。
もちろん、アプリ上で「高画質」の設定にすれば通信速度に関わらず高画質の動画を見ることも可能にしてあります。
SegmentControl
"SegmentControl": "SINGLE_FILE"
AndroidのExoPlayerでファイルダウンロードをする際に、SEGMENTED_FILESの設定だとやたら遅かったので、単一ファイルにしてあります。単一ファイルにしてもシークのレスポンスには体感余り差はありませんでした。
その他主要設定
iOS/Android/Webの全てで配信する必要があるので、出力グループはCMAFにして、S3上に格納するファイルサイズを減らしています。Live配信は行わないのでエンコード時間に対する要件は緩く、品質チューニングレベルはマルチパス HQにしてあります。
まとめ
動画エンコード周りを本格的に触るのは今回始めてだったので、求められる要件が達成できるかどうかは割と不安でしたが、そこまで大きなハマり無く達成できて良かったです。
AWS MediaConvertはソースをS3に置いたまま実行できるので、非常に扱いやすいですね。
abceedでは、人の学習効率を最大化する、という観点で色々な機能を作っています。
映画の英語学習体験もそうですが、他サービスには無い独特な機能を作ることが多いので、エンジニアとしても楽しめる環境かと思います。
現在アプリ/Web/サーバーエンジニア/PjMなど、ほぼすべての開発ポジションを募集中です!
ちょっとでも興味持った人は以下からカジュアル面談をご検討ください。色々お話します!
採用ページ