如何使用 TimedTextSource 在 MediaElement 上查看(srt)字幕

Posted

技术标签:

【中文标题】如何使用 TimedTextSource 在 MediaElement 上查看(srt)字幕【英文标题】:How to use TimedTextSource to view (srt) subtitle on MediaElement 【发布时间】:2018-09-24 17:38:57 【问题描述】:

我知道可以使用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(编辑www url。不小心我贴错了) 但他们没有任何明确的例子。

更新

我创建了以下代码。它开始播放视频,但仍然缺少字幕。有什么问题。 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();

好的...尝试从 GibHub 中的示例代码复制,但以下代码仍然无效。在 void 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】:

您必须将定时文本源添加到MediaSourceExternalTimedTextSources 集合中:

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

有关完整的工作示例,请参阅this Windows Universal sample on GitHub。

【讨论】:

以上是关于如何使用 TimedTextSource 在 MediaElement 上查看(srt)字幕的主要内容,如果未能解决你的问题,请参考以下文章

在 J2ME 中,如何使用 HttpConnection 设置 Header 信息?

如何使用 InspiroBot.me api?

如何在 J2ME 中裁剪图像

如何在 J2ME 中读取字符串?

如何从 djoser 端点(.../users/me)检索用户数据

如何使用 J2ME 波兰语在运行时更改项目的样式