From 0af353404cfbd941cdf7c8f334292db6c38ec74a Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Mon, 30 Mar 2020 14:46:05 +0800 Subject: [PATCH] fix the UTF-16 error while burning ass/ssa subtitles --- MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs | 4 +++- MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index c6748d7127..e22934f794 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -946,7 +946,7 @@ namespace MediaBrowser.Api.Playback.Hls gopArg = string.Format( CultureInfo.InvariantCulture, " -g {0} -keyint_min {0} -sc_threshold 0", - state.SegmentLength * Math.Ceiling(Convert.ToDecimal(framerate)) + Math.Ceiling(state.SegmentLength * framerate.Value) ); } @@ -980,6 +980,8 @@ namespace MediaBrowser.Api.Playback.Hls args += EncodingHelper.GetGraphicalSubtitleParam(state, encodingOptions, codec); } + // -start_at_zero is necessary to use with -ss when seeking, + // otherwise the target position cannot be determined. if (!(state.SubtitleStream != null && state.SubtitleStream.IsExternal && !state.SubtitleStream.IsTextSubtitleStream)) { args += " -start_at_zero"; diff --git a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs index a4a7595d29..5c2dc927b7 100644 --- a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs +++ b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs @@ -730,6 +730,14 @@ namespace MediaBrowser.MediaEncoding.Subtitles { var charset = CharsetDetector.DetectFromStream(stream).Detected?.EncodingName; + // UTF16 is automatically converted to UTF8 by FFmpeg, do not specify a character encoding + if ((path.EndsWith(".ass") || path.EndsWith(".ssa")) + && (string.Equals(charset, "utf-16le", StringComparison.OrdinalIgnoreCase) + || string.Equals(charset, "utf-16be", StringComparison.OrdinalIgnoreCase))) + { + charset = ""; + } + _logger.LogDebug("charset {0} detected for {Path}", charset ?? "null", path); return charset;