mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Add vtt and ass subtitle-offset in videoplayer
This commit is contained in:
parent
9677981344
commit
91241ceea1
5 changed files with 157 additions and 0 deletions
|
@ -188,6 +188,8 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
var currentAssRenderer;
|
||||
var customTrackIndex = -1;
|
||||
|
||||
var currentTrackOffset;
|
||||
|
||||
var videoSubtitlesElem;
|
||||
var currentTrackEvents;
|
||||
|
||||
|
@ -543,6 +545,65 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
setCurrentTrackElement(index);
|
||||
};
|
||||
|
||||
self.setSubtitleOffset = function(offset) {
|
||||
|
||||
var offsetValue = parseFloat(offset);
|
||||
var videoElement = self._mediaElement;
|
||||
var mediaStreamTextTracks = getMediaStreamTextTracks(self._currentPlayOptions.mediaSource);
|
||||
|
||||
Array.from(videoElement.textTracks)
|
||||
.filter(trackElement => {
|
||||
if (customTrackIndex === -1 ) {
|
||||
// get showing .vtt textTacks
|
||||
return trackElement.mode === 'showing';
|
||||
} else {
|
||||
// get current .ass textTrack
|
||||
return ("textTrack" + customTrackIndex) === trackElement.id;
|
||||
}
|
||||
})
|
||||
.forEach(trackElement => {
|
||||
|
||||
var track = mediaStreamTextTracks.filter(stream => {
|
||||
return ("textTrack" + stream.Index) === trackElement.id;
|
||||
})[0];
|
||||
|
||||
if(track) {
|
||||
offsetValue = updateCurrentTrackOffset(offsetValue);
|
||||
var format = (track.Codec || '').toLowerCase();
|
||||
if (format !== 'ass' && format !== 'ssa') {
|
||||
setVttSubtitleOffset(trackElement, offsetValue);
|
||||
}
|
||||
} else {
|
||||
console.log("No available track, cannot apply offset : " + offsetValue);
|
||||
}
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
function updateCurrentTrackOffset(offsetValue) {
|
||||
|
||||
var relativeOffset = offsetValue;
|
||||
var newTrackOffset = offsetValue;
|
||||
if(currentTrackOffset){
|
||||
relativeOffset -= currentTrackOffset;
|
||||
}
|
||||
currentTrackOffset = newTrackOffset;
|
||||
// relative to currentTrackOffset
|
||||
return relativeOffset;
|
||||
}
|
||||
|
||||
function setVttSubtitleOffset(currentTrack, offsetValue) {
|
||||
|
||||
if(currentTrack.cues) {
|
||||
Array.from(currentTrack.cues)
|
||||
.forEach(cue => {
|
||||
cue.startTime -= offsetValue;
|
||||
cue.endTime -= offsetValue;
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function isAudioStreamSupported(stream, deviceProfile) {
|
||||
|
||||
var codec = (stream.Codec || '').toLowerCase();
|
||||
|
@ -1167,6 +1228,11 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
|||
|
||||
function updateSubtitleText(timeMs) {
|
||||
|
||||
// handle offset for ass tracks
|
||||
if(currentTrackOffset) {
|
||||
timeMs += (currentTrackOffset * 1000);
|
||||
}
|
||||
|
||||
var clock = currentClock;
|
||||
if (clock) {
|
||||
try {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue