Intégration avancée du lecteur vidéo TCCSuperPlayerView avec ChinaCock 10.3.3

L'intégration du composant de lecture vidéo dans une application mobile peut présenter des défis, notamment pour gérer les différents modes d'affichage et les interactions système. La version 10.3.3 du framework ChinaCock apporte des améliorations significatives au composant TCCSuperPlayerView, permettant une intégration plus fluide et complète. Cet article détaille l'implémentation des fonctionnalités clés de ce lecteur amélioré.

Gestion des événements de navigation

L'événement OnBackPress est déclenché lorsque l'utilisateur appuie sur le bouton retour intégré au lecteur. Le paramètre playMode indique le mode de lecture actuel (fenêtre, plein écran, flottant). Le paramètre handled permet au développeur de contréler si l'événement doit être traité ou non. Voici un exemple d'implémentation :

procedure TMediaForm.PlayerBackPress(Sender: TObject; playMode: TPlaybackMode;
  var handled: Boolean);
begin
  handled := False;
  case playMode of
    TPlaybackMode.WindowMode:
      begin
        MediaViewer.PausePlayback;
        Close;
        handled := True;
      end;
    TPlaybackMode.FullscreenMode:
      begin
        if Display.Orientation = TScreenOrientation.Portrait then
        begin
          MediaViewer.PausePlayback;
          Close;
          handled := True;
        end;
      end;
    TPlaybackMode.FloatMode:
      begin
        // Traitement pour le mode flottant
      end;
  end;
end;

Dans ce code, lorsque le lecteur est en mode fenêtre ou en mode plein écran avec l'appareil en orientation portrait, l'action retour interrompt la lecture et ferme la vue.

Adaptation dynamique des modes de lecture

L'événement OnRequestPlayMode gère la transition entre les différents modes. Lors du passage en mode plein écran, l'application est mise en mode immersif et l'écran passe en orientation paysage. En mode fenêtre, l'orientation redevient portrait et l'application est mise en avant-plan.

procedure TMediaForm.MediaViewerRequestMode(Sender: TObject; requestedMode: TPlaybackMode);
begin
  if requestedMode = TPlaybackMode.FullscreenMode then
  begin
    IsFullscreen := True;
    MediaViewer.Parent := Self;
    MediaViewer.Align := TAlignLayout.Contents;
    Screen.Orientation := TScreenOrientation.Landscape;
  end
  else if requestedMode = TPlaybackMode.WindowMode then
  begin
    IsFullscreen := False;
    MediaViewer.Parent := PlayerContainerLayout;
    MediaViewer.Align := TAlignLayout.Contents;
    BringAppToFront('com.example.myapp');
    Screen.Orientation := TScreenOrientation.Portrait;
  end
  else if requestedMode = TPlaybackMode.FloatMode then
  begin
    SendAppToBackground;
  end;
end;

Traitement du bouton retour matériel

Pour une gestion cohérente, il faut intercepter la touche retour du système. En mode plein écran, un appui revient au mode fenêtre. En mode fenêtre, la lecture s'arrête et la vue se ferme.

procedure TMediaForm.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
  if Key = vkHardwareBack then
  begin
    case MediaViewer.CurrentMode of
      TPlaybackMode.WindowMode:
        begin
          MediaViewer.PausePlayback;
          Close;
        end;
      TPlaybackMode.FullscreenMode:
        begin
          MediaViewer.SwitchMode(TPlaybackMode.WindowMode);
        end;
      TPlaybackMode.FloatMode:
        begin
          MediaViewer.SwitchMode(TPlaybackMode.WindowMode);
        end;
    end;
    Key := 0;
  end;
end;

La méthode SwitchMode déclenche en interne l'événement OnRequestPlayMode défini précédemment.

Gestion de l'arrière-plan application

Lorsque l'application passe en arrière-plan (appel entrant, etc.), la lecture doit être suspendue. L'observateur d'activité native TCCFMXNativeActivityObserver fournit les événements nécessaires.

procedure TMediaForm.ActivityObserverPause(Sender: TObject);
begin
  if MediaViewer.CurrentMode <> TPlaybackMode.FloatMode then
  begin
    MediaViewer.PausePlayback;
  end;
end;

procedure TMediaForm.ActivityObserverResume(Sender: TObject);
begin
  MediaViewer.ResumePlayback;
end;

Configuration de l'interface utilisateur

Un fond noir pour le lecteur est essnetiel pour une expérience immersive. De plus, il faut adapter l'interface aux barres système (barre d'état, barre de navigation). Le composant TCCSystemBar permet d'obtenir ces dimensions.

procedure TMediaForm.FormCreate(Sender: TObject);
begin
  SystemBar.MakeStatusBarTranslucent;
  StatusBarLayout.Height := SystemBar.StatusBarHeight;
  NavBarLayout.Height := SystemBar.NavigationBarHeight;
end;

function TMediaForm.CalculateNavBarHeight: Single;
begin
  if SystemBar.IsNavigationBarVisible then
    Result := SystemBar.NavigationBarHeight
  else
    Result := 0;
end;

Pour les barres de navigation virtuelles dont la visibilité peut changer, un minuteur peut périodiquement mettre à jour la hauteur allouée.

procedure TMediaForm.NavBarTimerTimer(Sender: TObject);
begin
  if Self.Visible then
    NavBarLayout.Height := CalculateNavBarHeight;
end;

Le minuteur est activé lors de l'affichage de la vue et désactivé lors de sa masquade.

Mémorisation de la progression de lecture

Pour permettre la reprise d'une vidéo, il faut mémoriser la position. L'événement OnProgress fournit la progression courante en millisecondes.

procedure TMediaForm.MediaViewerProgress(Sender: TObject; progress, duration: Integer);
begin
  CurrentProgress := progress;
end;

Lors du chargement d'une vidéo, l'événement OnPrepared est déclenché. C'est ici que l'on effectue un saut à la position mémorisée, si elle existe.

procedure TMediaForm.MediaViewerPrepared(Sender: TObject);
begin
  if SavedProgress > 0 then
    MediaViewer.SeekToPosition(SavedProgress div 1000);
end;

Lors du démarrage de la lecture, on vérifie si l'URL correspond à la vidéo précédemment lue pour restaurer la progression.

procedure TMediaForm.StartVideoPlayback(const videoUrl: string);
begin
  if (PreviousUrl = videoUrl) and (CurrentProgress > 0) then
  begin
    SavedProgress := CurrentProgress;
    MediaViewer.Play('Retour', videoUrl);
  end
  else
  begin
    PreviousUrl := videoUrl;
    SavedProgress := 0;
    MediaViewer.Play('Retour', videoUrl);
  end;
end;

Cette implémentation mémorise la progression pour la lecture répétée d'une même vidéo. Pour une persistance multi-vidéos, un stockage local structuré serait nécessaire.

Étiquettes: ChinaCock TCCSuperPlayerView FireMonkey Android VideoPlayer

Publié le 27 juin à 01h39