[ad_1]
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 –
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; } } }
[ad_2]
コメント