Upgrade to Pro — share decks privately, control downloads, hide ads and more …

FlutterでPiP再生を実装した話

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 FlutterでPiP再生を実装した話

Flutter x Swift連携によるPiP(Picture-in-Picture)再生の実装方法を紹介します。video_playerパッケージをベースに、フォアグラウンドはFlutter、バックグラウンドはネイティブAVPlayerが担当する2プレーヤー並行再生方式で、シームレスなPiP体験を実現しました。

Avatar for 白井翔大

白井翔大

March 26, 2026
Tweet

Other Decks in Technology

Transcript

  1. PiP再生の実装方法 swift Flutter video player videoPlayer Controller ③textureId を渡す VideoPlayer

    (Widget) swift Flutter PiPメソッド VideoPlayer Plugin AVFoundation AVPlayer ⇩ CVPixelBuffer OSが描画 video player PiP再生 VideoPlayer Plugin AVPictureInPicture Controller AVFoundation AVPlayer ⇩ AVPlayerLayer ②Method Channel経由 でURL/Pathを 送る ②Method Channel経由 でURL/Pathを 送る ④動画のフ レームを生 成 ⑤参照して描 画
  2. 実際に実現したこと フォアグラウンド(アプリを開いている時) Flutter VideoPlayer ユーザーに表示 Native AVPlayer ミュート + 1x1px

    裏再生 バックグラウンド(ホームに戻った時) Flutter VideoPlayer 停止 Native AVPlayer ミュート解除 + PiP表示 2つの動画プレイヤーを常時並行再生してシームレスな PiP再生を実現 ミュート/pauseの切り替えで音の重複を防止している
  3. Flutter iOS PiP:2プレーヤー方式 Step 1: 初期化 Step 2: BG遷移 Step

    3: PiP中 Step 4: FG復帰 Step 5: 動画切替 • Flutter VideoPlayerで 再生 • 同URLでAVPlayer作成 • AVPlayerをミュートON • 1x1pxで画面に配置 • autoPiP設定を ON • バックグラウンド遷移 • 再生位置をNativeに同 期 • 進捗をサーバーに保存 • Flutter VideoPlayer停 止 • ミュート解除 • iOSが自動で PiP開始 • PiPウィンドウで再生中 • Native AVPlayerが担 当 • Flutterは停止中 (何もしていない) • アプリに戻る • Nativeから再生位置を 取得 • PiPウィンドウを閉じる • AVPlayerをミュートに戻 す • Flutterで該当位置に シーク • Flutter再生を再開 • 別の動画を選択 • Flutter側を新URLで初 期化 • 古いAVPlayerを破棄 • 新URLでAVPlayer再 作成 • ミュート裏再生を再開
  4. PiP再生の安定性と品質担保 Flutter層のロジックと操作はコードで品質を保証し、 OS層に依存する描画と再生体験は 手動で検証する UI操作・ 振る舞い 状態・計算 検証内容 動画の レンダリング

    テスト手法 考え方 Unitテスト 複雑なロジックの正常性を 高速かつ網羅的に検証する • 視聴進捗や完了ステータスの管理 • 再生速度やフルスクリーン等の設 定反映 Widgetテスト ユーザー操作に対する反応が 意図通りか検証する • 再生/停止等のUI操作 • PiPボタン操作時の通信 手動テスト 視聴体験の質とOS固有の 挙動は実機で保証する • 実際の動画の描画 • PiP小窓表示
  5. まとめ 01 ラーニング機能で目指した UX 02 Flutter × Native連携による PiPの実装 03

    PiP再生の安定性と品質担保 - ユーザーがキャリアについてストレスなく動画で学ぶ体験を提供 - video_playerパッケージを採用し、進捗管理やPiP再生の要件を実現 - フォアグラウンド時はFlutter、バックグラウンド時はNativeが 引き継ぐハイブリッドな構成でシームレスなPiP再生を実現 - 時間がかかる動画描画やOS依存のPiP表示は手動検証とし、 状態管理やUI操作をUnit/Widgetテストでカバー