update params when stream copying
This commit is contained in:
parent
d3a97e63f0
commit
049c13cec1
|
@ -2178,6 +2178,19 @@ namespace MediaBrowser.Api.Playback
|
||||||
inputModifier += " " + videoDecoder;
|
inputModifier += " " + videoDecoder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (state.VideoRequest != null)
|
||||||
|
{
|
||||||
|
var videoCodec = GetVideoEncoder(state);
|
||||||
|
// See if we can save come cpu cycles by avoiding encoding
|
||||||
|
if (string.Equals(videoCodec, "copy", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
if (string.Equals(state.OutputContainer, "mkv", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
inputModifier += " -noaccurate_seek";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return inputModifier;
|
return inputModifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -291,25 +291,6 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||||
private double[] GetSegmentLengths(StreamState state)
|
private double[] GetSegmentLengths(StreamState state)
|
||||||
{
|
{
|
||||||
var result = new List<double>();
|
var result = new List<double>();
|
||||||
if (state.VideoRequest != null)
|
|
||||||
{
|
|
||||||
var encoder = GetVideoEncoder(state);
|
|
||||||
|
|
||||||
if (string.Equals(encoder, "copy", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
var videoStream = state.VideoStream;
|
|
||||||
if (videoStream.KeyFrames != null && videoStream.KeyFrames.Count > 0)
|
|
||||||
{
|
|
||||||
foreach (var frame in videoStream.KeyFrames)
|
|
||||||
{
|
|
||||||
var seconds = TimeSpan.FromMilliseconds(frame).TotalSeconds;
|
|
||||||
seconds -= result.Sum();
|
|
||||||
result.Add(seconds);
|
|
||||||
}
|
|
||||||
return result.ToArray();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var ticks = state.RunTimeTicks ?? 0;
|
var ticks = state.RunTimeTicks ?? 0;
|
||||||
|
|
||||||
|
@ -936,27 +917,8 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||||
|
|
||||||
protected override bool CanStreamCopyVideo(VideoStreamRequest request, MediaStream videoStream)
|
protected override bool CanStreamCopyVideo(VideoStreamRequest request, MediaStream videoStream)
|
||||||
{
|
{
|
||||||
if (videoStream.KeyFrames == null || videoStream.KeyFrames.Count == 0)
|
return false;
|
||||||
{
|
//return base.CanStreamCopyVideo(request, videoStream);
|
||||||
Logger.Debug("Cannot stream copy video due to missing keyframe info");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var previousSegment = 0;
|
|
||||||
foreach (var frame in videoStream.KeyFrames)
|
|
||||||
{
|
|
||||||
var length = frame - previousSegment;
|
|
||||||
|
|
||||||
// Don't allow really long segments because this could result in long download times
|
|
||||||
if (length > 10000)
|
|
||||||
{
|
|
||||||
Logger.Debug("Cannot stream copy video due to long segment length of {0}ms", length);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
previousSegment = frame;
|
|
||||||
}
|
|
||||||
|
|
||||||
return base.CanStreamCopyVideo(request, videoStream);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -100,6 +100,7 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||||
{
|
{
|
||||||
// Comparison: https://github.com/jansmolders86/mediacenterjs/blob/master/lib/transcoding/desktop.js
|
// Comparison: https://github.com/jansmolders86/mediacenterjs/blob/master/lib/transcoding/desktop.js
|
||||||
format = " -f mp4 -movflags frag_keyframe+empty_moov";
|
format = " -f mp4 -movflags frag_keyframe+empty_moov";
|
||||||
|
//format = " -avoid_negative_ts disabled -start_at_zero -copyts -f mp4 -movflags frag_keyframe+empty_moov";
|
||||||
}
|
}
|
||||||
|
|
||||||
var threads = GetNumberOfThreads(state, string.Equals(videoCodec, "libvpx", StringComparison.OrdinalIgnoreCase));
|
var threads = GetNumberOfThreads(state, string.Equals(videoCodec, "libvpx", StringComparison.OrdinalIgnoreCase));
|
||||||
|
@ -135,11 +136,22 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||||
}
|
}
|
||||||
|
|
||||||
// See if we can save come cpu cycles by avoiding encoding
|
// See if we can save come cpu cycles by avoiding encoding
|
||||||
if (codec.Equals("copy", StringComparison.OrdinalIgnoreCase))
|
if (string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
return state.VideoStream != null && IsH264(state.VideoStream) && string.Equals(state.OutputContainer, "ts", StringComparison.OrdinalIgnoreCase) ?
|
var isOutputMkv = string.Equals(state.OutputContainer, "mkv", StringComparison.OrdinalIgnoreCase);
|
||||||
args + " -bsf:v h264_mp4toannexb" :
|
|
||||||
args;
|
if (isOutputMkv)
|
||||||
|
{
|
||||||
|
//args += " -copyts -avoid_negative_ts disabled -start_at_zero";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.VideoStream != null && IsH264(state.VideoStream) &&
|
||||||
|
(string.Equals(state.OutputContainer, "ts", StringComparison.OrdinalIgnoreCase) || isOutputMkv))
|
||||||
|
{
|
||||||
|
args += " -bsf:v h264_mp4toannexb";
|
||||||
|
}
|
||||||
|
|
||||||
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
var keyFrameArg = string.Format(" -force_key_frames expr:gte(t,n_forced*{0})",
|
var keyFrameArg = string.Format(" -force_key_frames expr:gte(t,n_forced*{0})",
|
||||||
|
|
Loading…
Reference in New Issue
Block a user