diff options
Diffstat (limited to 'MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs')
| -rw-r--r-- | MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs | 149 |
1 files changed, 72 insertions, 77 deletions
diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs index 90ec5aac7..22d09f34a 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs @@ -663,11 +663,6 @@ namespace MediaBrowser.Controller.MediaEncoding param += string.Format(" -r {0}", framerate.Value.ToString(_usCulture)); } - if (!string.IsNullOrEmpty(state.OutputVideoSync)) - { - param += " -vsync " + state.OutputVideoSync; - } - var request = state.BaseRequest; if (!string.IsNullOrEmpty(request.Profile)) @@ -724,14 +719,15 @@ namespace MediaBrowser.Controller.MediaEncoding } } // nvenc doesn't decode with param -level set ?! - if (string.Equals(videoEncoder, "h264_nvenc", StringComparison.OrdinalIgnoreCase)){ - param += ""; + else if (string.Equals(videoEncoder, "h264_nvenc", StringComparison.OrdinalIgnoreCase)) + { + //param += ""; } else if (!string.Equals(videoEncoder, "h264_omx", StringComparison.OrdinalIgnoreCase)) { param += " -level " + level; } - + } if (string.Equals(videoEncoder, "libx264", StringComparison.OrdinalIgnoreCase)) @@ -751,11 +747,6 @@ namespace MediaBrowser.Controller.MediaEncoding public bool CanStreamCopyVideo(EncodingJobInfo state, MediaStream videoStream) { - if (!videoStream.AllowStreamCopy) - { - return false; - } - var request = state.BaseRequest; if (!request.AllowVideoStreamCopy) @@ -901,11 +892,6 @@ namespace MediaBrowser.Controller.MediaEncoding public bool CanStreamCopyAudio(EncodingJobInfo state, MediaStream audioStream, List<string> supportedAudioCodecs) { - if (!audioStream.AllowStreamCopy) - { - return false; - } - var request = state.BaseRequest; if (!request.AllowAudioStreamCopy) @@ -1019,43 +1005,32 @@ namespace MediaBrowser.Controller.MediaEncoding public string GetAudioFilterParam(EncodingJobInfo state, EncodingOptions encodingOptions, bool isHls) { - var volParam = string.Empty; - var audioSampleRate = string.Empty; - var channels = state.OutputAudioChannels; + var filters = new List<string>(); + // Boost volume to 200% when downsampling from 6ch to 2ch if (channels.HasValue && channels.Value <= 2) { if (state.AudioStream != null && state.AudioStream.Channels.HasValue && state.AudioStream.Channels.Value > 5 && !encodingOptions.DownMixAudioBoost.Equals(1)) { - volParam = ",volume=" + encodingOptions.DownMixAudioBoost.ToString(_usCulture); + filters.Add("volume=" + encodingOptions.DownMixAudioBoost.ToString(_usCulture)); } } - if (state.OutputAudioSampleRate.HasValue) - { - audioSampleRate = state.OutputAudioSampleRate.Value + ":"; - } - - var adelay = isHls ? "adelay=1," : string.Empty; - - var pts = string.Empty; - if (state.SubtitleStream != null && state.SubtitleStream.IsTextSubtitleStream && state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode && !state.CopyTimestamps) { var seconds = TimeSpan.FromTicks(state.StartTimeTicks ?? 0).TotalSeconds; - pts = string.Format(",asetpts=PTS-{0}/TB", Math.Round(seconds).ToString(_usCulture)); + filters.Add(string.Format("asetpts=PTS-{0}/TB", Math.Round(seconds).ToString(_usCulture))); } - return string.Format("-af \"{0}aresample={1}async={4}{2}{3}\"", + if (filters.Count > 0) + { + return "-af \"" + string.Join(",", filters.ToArray()) + "\""; + } - adelay, - audioSampleRate, - volParam, - pts, - state.OutputAudioSync); + return string.Empty; } /// <summary> @@ -1287,7 +1262,7 @@ namespace MediaBrowser.Controller.MediaEncoding } var videoSizeParam = string.Empty; - + if (state.VideoStream != null && state.VideoStream.Width.HasValue && state.VideoStream.Height.HasValue) { videoSizeParam = string.Format("scale={0}:{1}", state.VideoStream.Width.Value.ToString(_usCulture), state.VideoStream.Height.Value.ToString(_usCulture)); @@ -1571,10 +1546,14 @@ namespace MediaBrowser.Controller.MediaEncoding if (state.IsVideoRequest) { + var outputVideoCodec = GetVideoEncoder(state, encodingOptions); + // Important: If this is ever re-enabled, make sure not to use it with wtv because it breaks seeking - if (string.Equals(state.OutputContainer, "mkv", StringComparison.OrdinalIgnoreCase) && state.CopyTimestamps) + if (!string.Equals(state.InputContainer, "wtv", StringComparison.OrdinalIgnoreCase) && + state.TranscodingType != TranscodingJobType.Progressive && + state.EnableBreakOnNonKeyFrames(outputVideoCodec)) { - //inputModifier += " -noaccurate_seek"; + inputModifier += " -noaccurate_seek"; } if (!string.IsNullOrWhiteSpace(state.InputContainer) && state.VideoType == VideoType.VideoFile && string.IsNullOrWhiteSpace(encodingOptions.HardwareAccelerationType)) @@ -1607,6 +1586,11 @@ namespace MediaBrowser.Controller.MediaEncoding } } + if (state.MediaSource.RequiresLooping) + { + inputModifier += " -stream_loop -1"; + } + return inputModifier; } @@ -1653,7 +1637,6 @@ namespace MediaBrowser.Controller.MediaEncoding if (state.ReadInputAtNativeFramerate || mediaSource.Protocol == MediaProtocol.File && string.Equals(mediaSource.Container, "wtv", StringComparison.OrdinalIgnoreCase)) { - state.OutputAudioSync = "1000"; state.InputVideoSync = "-1"; state.InputAudioSync = "1"; } @@ -1711,7 +1694,7 @@ namespace MediaBrowser.Controller.MediaEncoding { if (state.SubtitleStream == null || state.SubtitleDeliveryMethod != SubtitleDeliveryMethod.Embed) { - return ; + return; } // This is tricky to remux in, after converting to dvdsub it's not positioned correctly @@ -1878,7 +1861,9 @@ namespace MediaBrowser.Controller.MediaEncoding if (string.Equals(videoCodec, "copy", StringComparison.OrdinalIgnoreCase)) { - if (state.VideoStream != null && IsH264(state.VideoStream) && string.Equals(state.OutputContainer, "ts", StringComparison.OrdinalIgnoreCase) && !string.Equals(state.VideoStream.NalLengthSize, "0", StringComparison.OrdinalIgnoreCase)) + if (state.VideoStream != null && IsH264(state.VideoStream) && + string.Equals(state.OutputContainer, "ts", StringComparison.OrdinalIgnoreCase) && + !string.Equals(state.VideoStream.NalLengthSize, "0", StringComparison.OrdinalIgnoreCase)) { args += " -bsf:v h264_mp4toannexb"; } @@ -1892,51 +1877,56 @@ namespace MediaBrowser.Controller.MediaEncoding { args += " -flags -global_header -fflags +genpts"; } - - return args; } + else + { + var keyFrameArg = string.Format(" -force_key_frames \"expr:gte(t,n_forced*{0})\"", + 5.ToString(_usCulture)); - var keyFrameArg = string.Format(" -force_key_frames \"expr:gte(t,n_forced*{0})\"", - 5.ToString(_usCulture)); - - args += keyFrameArg; + args += keyFrameArg; - var hasGraphicalSubs = state.SubtitleStream != null && !state.SubtitleStream.IsTextSubtitleStream && state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode; + var hasGraphicalSubs = state.SubtitleStream != null && !state.SubtitleStream.IsTextSubtitleStream && state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode; - var hasCopyTs = false; - // Add resolution params, if specified - if (!hasGraphicalSubs) - { - var outputSizeParam = GetOutputSizeParam(state, videoCodec); - args += outputSizeParam; - hasCopyTs = outputSizeParam.IndexOf("copyts", StringComparison.OrdinalIgnoreCase) != -1; - } + var hasCopyTs = false; + // Add resolution params, if specified + if (!hasGraphicalSubs) + { + var outputSizeParam = GetOutputSizeParam(state, videoCodec); + args += outputSizeParam; + hasCopyTs = outputSizeParam.IndexOf("copyts", StringComparison.OrdinalIgnoreCase) != -1; + } - if (state.RunTimeTicks.HasValue && state.BaseRequest.CopyTimestamps) - { - if (!hasCopyTs) + if (state.RunTimeTicks.HasValue && state.BaseRequest.CopyTimestamps) { - args += " -copyts"; + if (!hasCopyTs) + { + args += " -copyts"; + } + args += " -avoid_negative_ts disabled -start_at_zero"; } - args += " -avoid_negative_ts disabled -start_at_zero"; - } - var qualityParam = GetVideoQualityParam(state, videoCodec, encodingOptions, defaultH264Preset); + var qualityParam = GetVideoQualityParam(state, videoCodec, encodingOptions, defaultH264Preset); - if (!string.IsNullOrEmpty(qualityParam)) - { - args += " " + qualityParam.Trim(); - } + if (!string.IsNullOrEmpty(qualityParam)) + { + args += " " + qualityParam.Trim(); + } - // This is for internal graphical subs - if (hasGraphicalSubs) - { - args += GetGraphicalSubtitleParam(state, videoCodec); + // This is for internal graphical subs + if (hasGraphicalSubs) + { + args += GetGraphicalSubtitleParam(state, videoCodec); + } + + if (!state.RunTimeTicks.HasValue) + { + args += " -flags -global_header"; + } } - if (!state.RunTimeTicks.HasValue) + if (!string.IsNullOrEmpty(state.OutputVideoSync)) { - args += " -flags -global_header"; + args += " -vsync " + state.OutputVideoSync; } return args; @@ -1974,7 +1964,12 @@ namespace MediaBrowser.Controller.MediaEncoding { args += " -ab " + bitrate.Value.ToString(_usCulture); } - + + if (state.OutputAudioSampleRate.HasValue) + { + args += " -ar " + state.OutputAudioSampleRate.Value.ToString(_usCulture); + } + args += " " + GetAudioFilterParam(state, encodingOptions, false); return args; |
