Как использовать TimedTextSource для просмотра (srt) субтитров на MediaElement - PullRequest
0 голосов
/ 24 сентября 2018

Я знаю, что с помощью 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";
    }
}

}

1 Ответ

0 голосов
/ 25 сентября 2018

Необходимо добавить источник синхронизированного текста в ExternalTimedTextSources коллекцию MediaSource:

var source = MediaSource.CreateFromUri(mediaUri);
var timedTextSource = TimedTextSource.CreateFromUri(timedTextUri);
source.ExternalTimedTextSources.Add(timedTextSource);

Полный рабочий пример см. этот пример Windows Universal на GitHub .

...