|  | @@ -2771,7 +2771,13 @@ namespace MediaBrowser.Controller.MediaEncoding
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              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)
 | 
	
		
			
				|  |  |                  {
 |