Browse Source

Backport pull request #11689 from jellyfin/release-10.9.z

Workaround ffmpeg keyframe seeking for external subtitles

Original-merge: 02937873b1f4e132a50d21fd2eca4c72160dd286

Merged-by: nielsvanvelzen <nielsvanvelzen@users.noreply.github.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
gnattu 1 năm trước cách đây
mục cha
commit
424ca49c26

+ 7 - 1
MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs

@@ -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)
                 {
                 {