我想允许用户上传字幕文件(例如".srt"(以使用纯HTML和JS沿着mp4播放。
我已经尝试了我能想到的一切,但现在没有想法了:
1( 尝试在video
元素的track
子元素上设置src
属性
2( 尝试在 JS 中创建新的track
元素,设置src
属性,并将track
追加为video
元素的子元素
3( 尝试使用video
元素的HTMLMediaElement.addTextTrack()
api,尽管TextTrack
api 似乎不支持src
属性。
4(尝试了所有这些方法,包括src
,srcObject
(尽管我认为此属性对track
元素无效(和URL.createObjectURL
的所有组合。
const $ = document.querySelector.bind(document);
$('#subtitles-input').addEventListener('change', () => {
// approach 1
$('#subtitles').src = URL.createObjectURL($('#subtitles-input').files[0]);
// approach 2
let track = document.createElement('track');
track.kind = 'captions';
track.label = 'English';
track.srclang = 'en';
track.src = URL.createObjectURL($('#subtitles-input').files[0]);
track.mode = 'showing';
$('#video').appendChild(track);
});
<lablel>Subtitles: <input id="subtitles-input" type="file"></lablel>
<video id="video" src="http://techslides.com/demos/sample-videos/small.mp4" controls>
<track id="subtitles" kind="subtitles" label="English captions" srclang="en" default>
</video>
显然,我的问题是使用.srt
格式而不是.vtt
格式。
它们几乎相同,添加WEBVTT
作为第一行并将用于表示毫秒的,
替换为.
就足以将有效的srt
文件转换为有效的vtt
文件。尽管vtt
似乎具有其他可选功能,例如文本格式。
就其价值而言,方法 1 和 2 同样有效。方法 3 和 4 不起作用的原因与上述原因相同:TextTrack
API 不支持src
属性srcObject
不是有效的track
元素属性,并且src
需要URL.createObjectURL(file)
。
const $ = document.querySelector.bind(document);
$('#subtitles-input').addEventListener('change', () => {
// approach 1
$('#subtitles').src = URL.createObjectURL($('#subtitles-input').files[0]);
// approach 2
let track = document.createElement('track');
track.src = URL.createObjectURL($('#subtitles-input').files[0]);
$('#video').appendChild(track);
});
<lablel>Subtitles: <input id="subtitles-input" type="file"></lablel>
<video id="video" src="http://techslides.com/demos/sample-videos/small.mp4" controls>
<track id="subtitles" kind="subtitles" label="English captions" srclang="en" default>
</video>