aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs')
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs47
1 files changed, 27 insertions, 20 deletions
diff --git a/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs
index 127145aec..9d051b38b 100644
--- a/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs
@@ -21,14 +21,14 @@ namespace MediaBrowser.MediaEncoding.Encoder
protected override string GetCommandLineArguments(EncodingJob state)
{
// Get the output codec name
- var videoCodec = state.OutputVideoCodec;
+ var videoCodec = EncodingJobFactory.GetVideoEncoder(state, GetEncodingOptions());
var format = string.Empty;
var keyFrame = string.Empty;
- if (string.Equals(Path.GetExtension(state.OutputFilePath), ".mp4", StringComparison.OrdinalIgnoreCase) &&
- state.Options.Context == EncodingContext.Streaming)
+ if (string.Equals(Path.GetExtension(state.OutputFilePath), ".mp4", StringComparison.OrdinalIgnoreCase))
{
+ // Comparison: https://github.com/jansmolders86/mediacenterjs/blob/master/lib/transcoding/desktop.js
format = " -f mp4 -movflags frag_keyframe+empty_moov";
}
@@ -53,42 +53,49 @@ namespace MediaBrowser.MediaEncoding.Encoder
/// Gets video arguments to pass to ffmpeg
/// </summary>
/// <param name="state">The state.</param>
- /// <param name="codec">The video codec.</param>
+ /// <param name="videoCodec">The video codec.</param>
/// <returns>System.String.</returns>
- private string GetVideoArguments(EncodingJob state, string codec)
+ private string GetVideoArguments(EncodingJob state, string videoCodec)
{
- var args = "-codec:v:0 " + codec;
+ var args = "-codec:v:0 " + videoCodec;
if (state.EnableMpegtsM2TsMode)
{
args += " -mpegts_m2ts_mode 1";
}
- // See if we can save come cpu cycles by avoiding encoding
- if (string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase))
+ var isOutputMkv = string.Equals(state.Options.OutputContainer, "mkv", StringComparison.OrdinalIgnoreCase);
+
+ if (state.RunTimeTicks.HasValue)
{
- return state.VideoStream != null && IsH264(state.VideoStream) && string.Equals(state.Options.OutputContainer, "ts", StringComparison.OrdinalIgnoreCase) ?
- args + " -bsf:v h264_mp4toannexb" :
- args;
+ //args += " -copyts -avoid_negative_ts disabled -start_at_zero";
}
- if (state.Options.Context == EncodingContext.Streaming)
+ if (string.Equals(videoCodec, "copy", StringComparison.OrdinalIgnoreCase))
{
- var keyFrameArg = string.Format(" -force_key_frames expr:gte(t,n_forced*{0})",
- 5.ToString(UsCulture));
+ if (state.VideoStream != null && IsH264(state.VideoStream) &&
+ (string.Equals(state.Options.OutputContainer, "ts", StringComparison.OrdinalIgnoreCase) || isOutputMkv))
+ {
+ args += " -bsf:v h264_mp4toannexb";
+ }
- args += keyFrameArg;
+ return args;
}
+ var keyFrameArg = string.Format(" -force_key_frames expr:gte(t,n_forced*{0})",
+ 5.ToString(UsCulture));
+
+ args += keyFrameArg;
+
var hasGraphicalSubs = state.SubtitleStream != null && !state.SubtitleStream.IsTextSubtitleStream;
// Add resolution params, if specified
if (!hasGraphicalSubs)
{
- args += GetOutputSizeParam(state, codec);
+ args += GetOutputSizeParam(state, videoCodec);
}
- var qualityParam = GetVideoQualityParam(state, codec, false);
+ var qualityParam = GetVideoQualityParam(state, videoCodec, false);
if (!string.IsNullOrEmpty(qualityParam))
{
@@ -98,7 +105,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
// This is for internal graphical subs
if (hasGraphicalSubs)
{
- args += GetGraphicalSubtitleParam(state, codec);
+ args += GetGraphicalSubtitleParam(state, videoCodec);
}
return args;
@@ -118,11 +125,11 @@ namespace MediaBrowser.MediaEncoding.Encoder
}
// Get the output codec name
- var codec = state.OutputAudioCodec;
+ var codec = EncodingJobFactory.GetAudioEncoder(state);
var args = "-codec:a:0 " + codec;
- if (codec.Equals("copy", StringComparison.OrdinalIgnoreCase))
+ if (string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase))
{
return args;
}