Comment afficher les sous-titres sur une vidéo comme Adobe Premiere en VB.NET et C# ?

la programmation


Salut les gars
Voici une liste avec 3 champs :
Heure de début, Heure de fin, Texte du sous-titre

Il y a près de 1 000 numéros dans la liste.

J’ai donc un VideoElement qui lit la vidéo, et j’ai créé un TextBlock dessus pour afficher cette liste comme sous-titre.

Pourriez-vous s’il vous plaît m’aider et me dire comment puis-je procéder ?
Je veux dire, lors de la lecture, le sous-titre de la liste affiche la synchronisation avec la vidéo dans le TextBlock ?
Merci.

Ce que j’ai essayé :

En fait, je n’ai aucune idée.
La seule idée que je pense est que je devrais peut-être créer une chronologie Adobe Premiere, et créer des images clés dans la liste, puis lier cela à la position de la vidéo… Je ne sais pas.

Solution 1

C’est compliqué, car l’utilisateur peut faire une pause, une avance rapide ou un retour en arrière à tout moment, et vous devez garder les sous-titres synchronisés avec la vidéo, sinon cela deviendra très déroutant.

Le mieux est probablement d’utiliser le fichier .SRT standard de l’industrie – cela peut aider : https://www.3playmedia.com/blog/create-srt-file/[^] – et vous constaterez que la plupart (sinon la totalité) des lecteurs vidéo utiliseront des fichiers .SRT et les synchroniseront automatiquement avec le contenu vidéo.

Solution 2

Une autre solution sera d’utiliser le contrôle ‘DispatcherTimer’ pour synchroniser vos titres –
Propriétés DispatcherTimer C#[^]

Votre code ressemblera à ce qui suit, ajustez la classe ‘SubtitleRecord’ et les parties d’initialisation en fonction de vos données réelles dans votre liste –

C#
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;

namespace SubtitleSyncApp
{
    public partial class MainWindow : Window
    {
        private List<SubtitleRecord> subtitleList = new List<SubtitleRecord>();
        private DispatcherTimer subtitleTimer = new DispatcherTimer();
        private int currentIndex = 0;

        public MainWindow()
        {
            InitializeComponent();
            InitializeSubtitleList(); 
            //Populate your subtitleList with 1000 records as per the class below...

            videoPlayer.MediaOpened += VideoPlayer_MediaOpened;

            subtitleTimer.Interval = TimeSpan.FromMilliseconds(100); 
            //Adjust the interval as needed...
            subtitleTimer.Tick += SubtitleTimer_Tick;
        }

        private void VideoPlayer_MediaOpened(object sender, RoutedEventArgs e)
        {
            subtitleTimer.Start();
        }

        private void SubtitleTimer_Tick(object sender, EventArgs e)
        {
            double currentPosition = videoPlayer.Position.TotalSeconds;

            //Now find the index of the subtitle that matches your player's current position...
            while (currentIndex < subtitleList.Count - 1 && currentPosition > subtitleList[currentIndex + 1].StartTime)
            {
                currentIndex++;
            }

            //Update your subtitle text accordingly...
            subtitleTextBlock.Text = subtitleList[currentIndex].SubtitleText;
        }

        private void InitializeSubtitleList()
        {
            //Populate your subtitleList with 1000 records / replace this with your actual data...
            for (int i = 0; i < 1000; i++)
            {
                subtitleList.Add(new SubtitleRecord
                {
                    StartTime = i * 5, 
                    //This is as an example, adjust start times as needed or per yur list...
                    EndTime = (i + 1) * 5,
                    SubtitleText = $"Subtitle {i + 1}"
                });
            }
        }
    }

    public class SubtitleRecord
    {
        public double StartTime { get; set; }
        public double EndTime { get; set; }
        public string SubtitleText { get; set; }
    }
}

コメント

タイトルとURLをコピーしました