Workaround ffmpeg keyframe seeking for external subtitles

We seek to the exact position of the keyframe for direct stream/remuxing, but FFmpeg seeks to the previous keyframe when the exact time is provided as input. To work around this, add a 0.5 second offset to the seeking time.

Signed-off-by: gnattu <gnattuoc@me.com>
pull/11689/head
gnattu 6 months ago
parent 26714e2c62
commit dec2032e13

@ -2771,7 +2771,13 @@ namespace MediaBrowser.Controller.MediaEncoding
if (time > 0) if (time > 0)
{ {
seekParam += string.Format(CultureInfo.InvariantCulture, "-ss {0}", _mediaEncoder.GetTimeParameter(time)); // For direct streaming/remuxing, we seek at the exact position of the keyframe
// However, ffmpeg will seek to previous keyframe when the exact time is the input
// Workaround this by adding 0.5s offset to the seeking time to get the exact keyframe on most videos.
// This will help subtitle syncing.
var isHlsRemuxing = state.IsVideoRequest && state.TranscodingType is TranscodingJobType.Hls && IsCopyCodec(state.OutputVideoCodec);
var seekTick = isHlsRemuxing ? time + 5000000L : time;
seekParam += string.Format(CultureInfo.InvariantCulture, "-ss {0}", _mediaEncoder.GetTimeParameter(seekTick));
if (state.IsVideoRequest) if (state.IsVideoRequest)
{ {

Loading…
Cancel
Save