【ITニュース解説】A completed video seek did not always produce a new frame callback
2026年10月07日に「Dev.to」が公開したITニュース「A completed video seek did not always produce a new frame callback」について初心者にもわかりやすく解説しています。
ITニュース概要
動画のシーク(再生位置変更)後、画面が更新されていなくても新しいフレームの描画完了コールバックが来ない場合がある。これはWebKItのテストで確認され、シーク完了と画面描画完了は別物として扱うべきだ。既存のフレームで要件を満たすこともあるため、自動的にエラーとせず、個別に判断する必要がある。
ITニュース解説
動画を再生したり、特定の場面にスキップしたりする「シーク」は、ウェブサイトで動画を扱う上で重要な操作である。システムエンジニアは、ユーザーが指定した時間に正確に動画の再生位置を移動させ、その移動先の画面を正しく表示させる必要がある。通常、シークが完了すると、新しいフレーム(動画を構成する1枚1枚の画像)が描画され、その描画が完了したことをプログラムに通知する「コールバック」と呼ばれる仕組みが動作することを期待する。しかし、この記事では、このコールバックが常に期待通りに発生するわけではない、というWebKit(Safariなどのウェブブラウザが使用する描画エンジン)の特定の挙動について検証している。
動画が一時停止した状態でシークを実行した際、シークは完了したのに、新しいフレームが画面に描画されたことを示すコールバックが来ないケースがあった。これは一見エラーに見えるが、実際にはシーク先のフレームが、すでに画面に表示されているフレームと同じ場合、新しいフレームの描画が不要なため、コールバックが発生しない、という状況だった。この挙動はWebブラウザのテスト環境で確認され、シークが完了したという信号と、新しいフレームが実際に画面に表示されたという信号は、それぞれ別のものとして扱うべきだという重要な示唆を与えている。どちらか一方の信号だけでは、動画の再生位置移動が完全に成功したとは判断できない可能性がある。
この検証では、ピクセル自体にフレーム番号がエンコードされた特別なH.264形式の動画クリップが使われた。H.264は一般的な動画圧縮形式の一つだ。これにより、プログラム上のcurrentTime値だけでなく、実際に画面にどのフレームが描画されているかを正確に確認できる。このクリップは30fps(1秒間に30フレーム)で180フレームからなり、GOP(動画の圧縮単位)の長さが異なる3つのバージョン(15, 60, 180フレーム)でテストされた。
テストは、動画クリップを読み込み、一時停止した状態から開始された。初期フレームの描画コールバックが完了後、新しいフレーム描画のコールバックと、シーク完了を示すseekedイベントのリスナーを登録し、シーク位置を指定する。WebKitのテストビルド(バージョン26.5)で、0秒から0.017秒へシークした際、seekedイベントは発生したものの、Canvas(ウェブページ上でグラフィックを描画する領域)の内容は初期の0フレーム目のままで、1.7秒間新しいフレーム描画コールバックは発生しなかった。
30fpsの動画では、0.017秒は最初のフレーム(0フレーム目)の表示期間内にある。そのため、0.017秒へシークしてもターゲットは0フレーム目のままであり、画面のピクセル更新は不要となる。この場合、画面内容が変わらないことは期待通りの結果であり、新しいフレームが描画されないためコールバックも発生しない。その後、この動画は11の異なるターゲットへのシークをテストされ、それら全てで新しいフレーム描画コールバックが発生した。例えば、次のターゲットである0.049秒へのシークでは、画面に1フレーム目が描画され、コールバックも発生した。このことから、同じフレームをリクエストした場合と、異なるフレームをリクエストした場合とで、コールバックの挙動が異なることが明確になった。単にコールバックが来なかったからといって、それを全て同じエラーとして扱うのは適切ではない。
海辺の波の映像を使った別のテストでは、シーク後の即時描画と、シーク完了後の描画で、表示される波の形が異なる場合があった。両者ともに動画の再生時間を示すcurrentTimeプロパティは同じ値を示していたにもかかわらず、実際の画面ピクセルは異なっていたのだ。これは、プログラム上の時間が更新されただけでは、必ずしも画面のピクセルが更新されたことにはならないという事実を浮き彫りにする。フレーム番号入りテストでは、108回の即時描画のうち99回で以前のフレームがそのまま表示されていた。残りの9回は、古いピクセルがたまたまターゲットのフレームと一致していたケースだった。
この独立した再現実験は、currentTimeプロパティの変更が必ずしもピクセル更新の証明ではないことを示している。ただし、この実験では、フレーム番号入りテストで発生した「1.7秒間コールバックが来ない」というタイムアウトの現象は再現されていない。これら二つの観察結果を混同しないことが重要である。そうしないと、更新されていないコンテンツの例が、「すべての未変更フレームが間違っている」という誤った結論につながる可能性がある。
さらに、中国の動画マット合成ベータ版ワークベンチ「ImgIng」を使った製品側の確認も行われた。波の動画をインポートし、2.117秒に移動、シーク完了を待ってプレビューを要求したところ、「明確な被写体がありません」というメッセージが返ってきた。これは、このアプリケーションがプレビューパスと結果において同様の挙動を示したことを確認するものではあるが、アプリケーション内部の待ち戦略や完全なサムネイルエクスポートは検証されていないため、このアプリケーションがコールバックの修正策の証拠になるわけではない、とされている。
これらの検証結果から、動画再生システムの実装では、要求されたシーク位置、シーク完了、利用可能なピクセルの証拠、コールバック結果をそれぞれ独立した情報として保持すべきだと提言されている。もし、待機中にタイムアウトが発生したとしても、そのタイムアウトをもってすぐに画面を黒くするのではなく、観察結果を保存すべきだ。既存フレームが要求を満たすか判断するには、明確な許容範囲や、ピクセルにエンコードされたフレーム番号のような信頼できる参照が必要となる。今回のテストフィクスチャでは正確なフレーム番号があったため判断できたが、フレームレートが変動するような一般的な動画入力に対しては、別の検証方法が必要であり、それはまだテストされていない。
ウェブ上で動画を扱うシステムでは、キャプチャヘルパーなどの機能導入前に、「同じフレームへのシーク」と「異なるフレームへのシーク」の両シナリオでテストを行い、タイムアウトやキャンセル時のクリーンアップも確認することが推奨されている。今回の実験は、新しいフレーム描画コールバックだけではシーク完了の条件として不完全であることを示している。システムエンジニアは、動画のシークと描画の挙動について、より深い理解と慎重な設計が求められる。