Я знаю, что с помощью MediaElement
можно просматривать внешние субтитры, но я не понимаю, как это сделать.Кто-нибудь может объяснить мне, как связать субтитры с MediaElement
.
Это единственная подсказка, которую я знаю до сих пор.Но как сказать MediaElement
, чтобы использовать это?
TimedTextSource.CreateFromUri(new Uri("ms-appx:///TheVideoTitle.srt"), "en");
Я нашел много информации об этом с веб-сайта Microsoft: https://docs.microsoft.com/en-us/uwp/api/windows.media.core.timedtextsource (отредактированный URL-адрес www. Случайно вставил неправильный), ноу них нет четких примеров.
ОБНОВЛЕНИЕ
Я создал следующий код.Он начинает воспроизводить видео, но субтитры по-прежнему отсутствуют.В чем проблема.MediaElement был создан в XAML следующим образом:
<MediaPlayerElement x:Name="MyVideoPlayer" Stretch="Fill"/>
Этот код все еще не работает:
//Get MediaPlayerElement
MediaPlayerElement VideoPlayer = 'THE MEDIAPLAYER ELEMENT IN XAML';
//Get video file StorageFile
StorageFile VideoStorageFile = await StorageFile.GetFileFromPathAsync(GetMultimediaPlayer(ID).LocalVideoInformation.TitleFilePathOnStorage);
//Create MediaSource using VideoStorageFile as source
MediaSource VideoMediaSource = MediaSource.CreateFromStorageFile(VideoStorageFile);
//Create subtitle Uri
Uri SubtitleUri = new Uri("ms-appx:///TheTestSubtitle.srt");
//Set SubtitleUri as source of TimedTextSource
TimedTextSource SubtitleTimedTextSource = TimedTextSource.CreateFromUri(SubtitleUri);
//Add TimedTextSource (SubtitleTimedTextSource) to MediaSource (VideoMediaSource)
VideoMediaSource.ExternalTimedTextSources.Add(SubtitleTimedTextSource);
//Set MediaPlayerElement (VideoPlayer) source
VideoPlayer.Source = VideoMediaSource;
//Play
VideoPlayer.MediaPlayer.Play();
OK ... Попытался скопировать из примера кода в GibHub, но все еще следующий кодне работа.В пустоте Tts-Resolved
args.Error
происходят.(Системе не удается найти указанный файл.) Интересно, в чем проблема: все файлы srt и т. Д. Находятся точно в тех же папках, что и в примере приложения.
public sealed partial class MainPage : Page
{
private Dictionary<TimedTextSource, Uri> ttsMap = new Dictionary<TimedTextSource, Uri>();
public MainPage()
{
this.InitializeComponent();
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
var source = MediaSource.CreateFromUri(new Uri("https://mediaplatstorage1.blob.core.windows.net/windows-universal-samples-media/elephantsdream-clip-h264_sd-aac_eng-aac_spa-aac_eng_commentary.mp4"));
var ttsEnUri = new Uri("ms-appx:///Assets/Media/ElephantsDream-Clip-SRT_en.srt");
var ttsEn = TimedTextSource.CreateFromUri(ttsEnUri);
ttsMap[ttsEn] = ttsEnUri;
var ttsPtUri = new Uri("ms-appx:///Assets/Media/ElephantsDream-Clip-SRT_pt.srt");
var ttsPt = TimedTextSource.CreateFromUri(ttsPtUri);
ttsMap[ttsPt] = ttsPtUri;
var ttsSvUri = new Uri("ms-appx:///Assets/Media/ElephantsDream-Clip-SRT_sv.srt");
var ttsSv = TimedTextSource.CreateFromUri(ttsSvUri);
ttsMap[ttsSv] = ttsSvUri;
ttsEn.Resolved += Tts_Resolved;
ttsPt.Resolved += Tts_Resolved;
ttsSv.Resolved += Tts_Resolved;
source.ExternalTimedTextSources.Add(ttsEn);
source.ExternalTimedTextSources.Add(ttsPt);
source.ExternalTimedTextSources.Add(ttsSv);
var playbackItem = new MediaPlaybackItem(source);
playbackItem.TimedMetadataTracksChanged += (item, args) =>
{
playbackItem.TimedMetadataTracks.SetPresentationMode(0, TimedMetadataTrackPresentationMode.PlatformPresented);
};
mediaPlayerElement.Source = playbackItem;
}
private void Tts_Resolved(TimedTextSource sender, TimedTextSourceResolveResultEventArgs args)
{
var ttsUri = ttsMap[sender];
if (args.Error != null)
{
return;
}
var ttsUriString = ttsUri.AbsoluteUri;
if (ttsUriString.Contains("_en"))
args.Tracks[0].Label = "English";
else if (ttsUriString.Contains("_pt"))
args.Tracks[0].Label = "Portuguese";
else if (ttsUriString.Contains("_sv"))
args.Tracks[0].Label = "Swedish";
}
}
}