🧊

W3C TPAC 2019 に行ってきたメモ Part.2

最終日!

TPAC 2019: Detailed schedule

このPart.2は金曜の記事で、この日はずっと「Media WG」のオブザーバーしてました。

MSE, DataCue and TextTrackCue

DataCue / TextTrackCue
  • https://github.com/WICG/datacue/blob/master/explainer.md
  • HLS/DASHなどの再生にあわせて動的にコンテンツを挿入したりしたい
    • 広告とか、字幕とか、etc
  • メディアのコンテナに含まれるメタデータを、JS側にイベントで知らせたい
    • メディア -> JSへのin-bandでデータを流すのがDataCueの目的
    • TextTrackCueはその逆方向
  • 論点はデータの処理をどこでやるか
    • ブラウザ側で余計な処理はすべきではない
    • メインスレッドとの行き来はコスト
    • メディア側でやるとしても、気付かずにJS側で2重でパースしちゃうこともあるかも
    • mp3のid3とかよくある
  • WICGのリポジトリでデザインを固めるのでよさそう
    • 今の提案は少しスコープが大きいので、より細かいシンプルなケースが必要かも
    • コンポーネントも細分化できるはず
  • やり取りするデータは何がいいか
    • 暗号化の問題はどうなる
    • JSON
    • どうせDOMに表示するなら、DOM fragmentsとかでもよいのでは
    • 時間がかかる処理でもある
  • APIを同期にするか非同期にするか
    • 非同期のほうがよさそうではある
  • MSEとあわせて考える必要はある?
    • デザインによってはMSEのパーサーを使わずにやれるかもしれない
    • 概観を示して分離できるものは分離したい
  • メタデータについて
  • Sourcing In-band Media Resource Tracks from Media Containers into HTML
  • Media Fragments URI 1.0 (basic)
  • メディアのin-bandにメタデータをそもそも含めるべきか
    • ブロードキャストのユースケースでは、in-bandが望ましい
    • DASHでは選択可能
  • (どのWGで主導すべきかみたいな話)
  • 結論: DataCueの検討は進めていく

MSE: vNext

MSE in Worker
  • MSEをWorkerコンテキストで使いたい
    • FOMSでDEMOを作った
    • 仕様より実装で問題をみつけた
    • `URL`オブジェクトをつかってWorkerとやり取りしてる
  • ServiceWorkerでも使えるとよい?
    • ユースケースがなさそう
    • あれはNetwork系のことをやる場所では
    • SourceBufferとGCの問題もある
Eviction Policiesについて
  • 低レイテンシの配信なのでは、GOPを無限にして遅延を最小化したい
    • MSEは全てをバッファリングするので、それができない
    • GOP = キーフレームと依存フレームの1かたまりでバッファリングとGCに使われる
  • これはそれをなんとかするための提案
  • 次のFOMSでプロトタイプの実装をしてみる
  • 最新から遅れている場合には先頭にシークしたい
    • GOPが無限だとシークできないのでは
    • 実装を調べてみる

MSE: issues

Restore auto-revoking behavior of createObjectURL(MediaSource) to revert breaking change introducing memory leaks
Support playback through unbuffered ranges, and allow app to provide buffered gap tolerance
  • https://github.com/w3c/media-source/issues/160
  • vNextでは、欠落したデータ(ギャップ)の処理と低遅延のためのEvictionPolicyが求められてる
  • ギャップについて
    • アプリケーションで把握できるギャップと、不明なギャップがある
    • スキップできるギャップもあるはず
    • videoはないけどaudioだけはある場合に、videoを待ちたくないかも
    • 既存のMSEプレーヤーはだいたいトラックごとにSourceBufferを持ってる
    • HTMLの`bufferedRanges`の仕様が変わったので、MSEでも追従したい
    • https://html.spec.whatwg.org/#dom-media-buffered
EvictionPolicyについて
  • ビデオ再生の終わっても、バッファを持ち続けるのはよくない
    • Appleはメモリ使用量にも懸念があると言ってる
  • ポリシーの追加は、すでに同様の実装があるappには嬉しくないかも
MSE in Worker
  • ServiceWorkerのEditorいわく、APIはできる限りSWに公開できるとよい
    • `createObjectURL()`のように許可されないものもあるけど
  • Workerから返すデータはobject URL?transferable object?
  • SWでMediaSourceを作ってそれをどうmedia要素で描画するのか
  • SWで使えるようにすべきかどうかは、SWのグループとも議論が必要
JSON/RAW MediaSource Byte Streams

Media Playback Quality

  • https://github.com/w3c/media-playback-quality
  • Should MediaPlaybackQuality keep VideoPlaybackQuality backward compatibility
  • Don't return a read-only object
    • https://github.com/w3c/media-playback-quality/issues/3
    • すでにshipされてるブラウザの挙動にあわせるべき
    • pollingよりも代わりにイベントを発火するほうがよいかもしれない
    • 差分ではなく同じシェイプのディクショナリを通知するほうがわかりやすい
    • 結論: 後方互換性を保ちながらイベントでディクショナリで`VideoPlaybackQuality`を通知する
    • バックグラウンド時にはどうなる?
    • Chromeは賢くて、何もしないようになってる
    • 他にフレームがドロップする可能性は?
      • 再生開始時
      • PinPにしたとき?
    • 結論: `corruptedVideoFrames`は消す
  • (フレームレートについてのあれこれ)
  • 4Kビデオを再生するとき
    • Firefoxはフレームを落としても再生する
    • Chromeは一時停止するのでフレームはドロップしない
    • どっちがよい?
    • あるべきをissueで議論して、実装を修正するのがよい

Media Session

Add "seek to start" and "seek to live" actions
  • https://github.com/w3c/mediasession/issues/233
  • 複数のライブストリームが連なってる場合に、特定のストリームの先頭、最新に飛びたい
  • 現状のMediaSessionは、長さ固定のメディア用
  • ハードウェアにあるボタンとのインテグレーションも考慮が必要
  • OSで使うことができるアイコンにも制限がある
  • 結論: スキップボタンと同じで、将来的にラベルで指定できるようにする
TAG Feedback: of all the potential metadata...?
MediaSessionActionHandler doesn't work for seek operations

Picture in Picture

Provide a clear definition of when a UA should display controls in a PiP window
Style restrictions in picture-in-picture mode excludes mirrored video use cases
Add option or method to set Picture-in-PictureWindow to maximum size programmatically
Add a option to go fullscreen from picture in picture window
Integration with HTML
  • https://github.com/w3c/picture-in-picture/issues/156
  • HTML側のSpecとの統合
  • 筋は通っていると思うが、HTMLの仕様は膨大
  • すべてを統合できるわけではない
    • JS的なAPI都合もある
  • 逆にHTMLMediaElementを別の仕様にできない・・?
    • 過去に試みたが実現しなかったらしい
    • でもやってやれないことはないと思ってる
  • 結論: 改めてmediaをHTMLと分けることを議論してみる
PinP v2について
  • videoを表示する以上のことができるようにしたい
    • ミュートボタンを置きたいなど、ウィンドウへのカスタマイズが望まれてる
  • カスタムcontrolsを最初は考えたが、独自のアイコンを使用できない欠点があった
    • なのでなんでも自由に配置できるAPIにした
    • ただのポップアップではなく、あくまでPinPとして
  • DOMの一部をPinPできる?Fullscreenみたいに
    • 検討したけどやめた
    • サイズ・位置変更の問題があった
  • 新たなwindowとすることを検討した
    • window間は`postMessage()`でないとコミュニケーションできない
    • これは使いにくいと思った
  • Presentation APIとも連携が必要かも
    • 単にこれを使うのすら難易度が高いけど
  • もはや`iframe`を活用するほうがよいかも?
    • でもあれは問題も多いし・・
  • どちらにせよこの仕様として大きな変化である
    • 膨大な作業も必要
    • 仕様検討もそうだが、APIを利用する開発者のコスパに見合う機能であるべき
  • PinPcanvasをオーバーレイするところからはじめる?
    • インタラクションはなしで
  • (ここで結論出すの無理じゃね的な話)

Autoplay

  • https://github.com/w3c/autoplay
  • 昨今のWebでは、音ありでは`autoplay`できないことがしばしば
  • 再生が許可されていない場合、`play()`はrejectされる
  • 自動再生できる状態かどうかを知るための方法がない
    • 実際に`video.src`を用意して`play()`しないといけない
    • 自動再生できないなら、字幕付きで音声なしの動画を再生するなどしたい
  • ドキュメント単位か、要素単位でやらせるか
  • `document.xxx`にenumを返すプロパティを足す案
    • `allowed`, `allowed-muted`, `disallowed`, `unknown`
  • FirefoxSafariも、音声の有無に関わらず、自動再生を禁止できる
    • 今はuser gestureが必要
Document Level API issue
  • https://github.com/w3c/autoplay/issues/7
  • 案1: `document`にプロパティを追加
    • 明確でシンプル
    • だがポリシーと実装が複雑になる
  • 案2: 非同期のAPIを追加
    • 事前に何もしなくてよい
    • より複雑になる
    • イベントループのすき間でユーザーアクションがあったら?
  • Permissions APIにはイベントがある
  • 今日のChromeは、自動再生ポリシーのために多くの手順を踏んでいる
    • 設定、アクティビティ、設定値・・
    • 自動再生の許可に関係なく、このデータは取得してる
    • それでページの表示速度に影響はない
  • なんであれDBにアクセスするなら非同期なのでは?
    • 非同期だと複数回読み取り(無駄)が発生する可能性もあるよね
  • (ここで議論が発散した + 時間切れ)

2日目の感想

まじめなやつ。

  • WebRTC WGとは打って変わって、Media WGは当日の議論がメインだった
    • そのせいで聞き取るのめっちゃ大変やった
  • 初耳なSpecも多くて、全体的に自信がない
  • スコープが広いトピックが多くて、これほんとに決まんの?みたいな印象
  • めっちゃ議論が盛り上がってるのに1730になった瞬間みんな部屋から消えていった
    • 見習いたいこのノリ

そのほか。

  • W3C湯呑もらってくるの忘れた・・・
  • 博多グルメは水炊きが優勝