据说系统内置的多媒体功能支持 srt、 ssa 等字幕,老周测试过几种格式的字幕均能加载。
SRT 字幕是最简单的字幕结构,甚至你用记事本都能做出来,就是分为几行来写。
第一行是字幕的编号,应该是从1开始的,反正工具生成的SRT都是从1开始编号;
第二行是字幕的开始时间和结束时间,中间用一个 “-->”来分隔;
第三行是字幕内容。
比如这样:
18 00:03:37,933 --> 00:03:45,366 時而憑風遨遊,時而髙談怪論 19 00:03:45,366 --> 00:03:45,599 20 00:03:45,600 --> 00:03:49,800 來往於仙山飄渺之間
编号为19的字幕是空白,所以第三行没有内容。
好,下面就说说加载外部SRT字幕的方法。
第一步:创建MediaSource,然后把这个MediaSource实例与MediaElement控件关联,这样就可以在界面上播放。
FileOpenPicker picker = new FileOpenPicker(); picker.FileTypeFilter.Add(".mkv"); picker.FileTypeFilter.Add(".mp4"); StorageFile file = await picker.PickSingleFileAsync(); if (file != null) { MediaSource ms = MediaSource.CreateFromStorageFile(file); me.Tag = ms; me.SetPlaybackSource(ms); }
第二步,加载字幕文件,然后创建TimedTextSource对象,再把它加入到MediaSource.ExternalTimedTextSources属性中,这个属性是一个列表,类型为TimedTextSource。每加入一个TimedTextSource对象就多一个字幕轨道。
MediaSource mdsrc = me.Tag as MediaSource; FileOpenPicker picker = new FileOpenPicker(); picker.FileTypeFilter.Add(".srt"); StorageFile srtfile = await picker.PickSingleFileAsync(); if (srtfile != null) { IRandomAccessStream stream = await srtfile.OpenReadAsync(); TimedTextSource txtsrc = TimedTextSource.CreateFromStream(stream); mdsrc.ExternalTimedTextSources.Clear(); mdsrc.ExternalTimedTextSources.Add(txtsrc); }
这样就完成了。如果视频文件有内置字幕,方法也一样,只是在创建TimedTextSource对象时指定的是视频文件本身,如果是外部字幕,就指定字幕文件。
运行应用程序,先打开视频播放,然后选择字幕文件。当添加了有效的字幕文件后,MediaElement控件的控制条中会出现一个打开字幕的按钮。如图。
然后,点击这个按钮就可以选择加载的字幕,或者关闭字幕。
最后,在视频中就能显示字幕了。