remove call from probe result normalizer

This commit is contained in:
Luke Pulverenti 2015-12-19 11:46:32 -05:00
parent 940702aa0b
commit 5c610d71f6
2 changed files with 77 additions and 22 deletions

View File

@ -262,6 +262,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
var mediaInfo = new ProbeResultNormalizer(_logger, FileSystem).GetMediaInfo(result, videoType, isAudio, primaryPath, protocol);
await DetectInterlaced(mediaInfo, inputPath, probeSizeArgument).ConfigureAwait(false);
if (extractKeyFrameInterval && mediaInfo.RunTimeTicks.HasValue)
{
if (ConfigurationManager.Configuration.EnableVideoFrameByFrameAnalysis && mediaInfo.Size.HasValue)
@ -304,6 +306,81 @@ namespace MediaBrowser.MediaEncoding.Encoder
throw new ApplicationException(string.Format("FFProbe failed for {0}", inputPath));
}
private async Task DetectInterlaced(MediaSourceInfo video, string inputPath, string probeSizeArgument)
{
var videoStream = video.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Video);
if (video.Protocol != MediaProtocol.File || videoStream == null)
{
return;
}
// Take a shortcut and limit this to containers that are likely to have interlaced content
if (!string.Equals(video.Container, "ts", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(video.Container, "wtv", StringComparison.OrdinalIgnoreCase))
{
//return;
}
var args = "{0} -i {1} -map 0:v:{2} -filter:v idet -frames:v 500 -an -f null /dev/null";
var process = new Process
{
StartInfo = new ProcessStartInfo
{
CreateNoWindow = true,
UseShellExecute = false,
// Must consume both or ffmpeg may hang due to deadlocks. See comments below.
RedirectStandardOutput = true,
RedirectStandardError = true,
RedirectStandardInput = true,
FileName = FFMpegPath,
Arguments = string.Format(args, probeSizeArgument, inputPath, videoStream.Index.ToString(CultureInfo.InvariantCulture)).Trim(),
WindowStyle = ProcessWindowStyle.Hidden,
ErrorDialog = false
},
EnableRaisingEvents = true
};
_logger.Info("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
using (var processWrapper = new ProcessWrapper(process, this, _logger))
{
try
{
StartProcess(processWrapper);
}
catch (Exception ex)
{
_logger.ErrorException("Error starting ffprobe", ex);
throw;
}
try
{
process.BeginOutputReadLine();
using (var reader = new StreamReader(process.StandardError.BaseStream))
{
var result = await reader.ReadToEndAsync().ConfigureAwait(false);
File.WriteAllText("D:\\\\1.txt", result);
}
}
catch
{
StopProcess(processWrapper, 100, true);
throw;
}
}
}
private bool EnableKeyframeExtraction(MediaSourceInfo mediaSource, MediaStream videoStream)
{
if (videoStream.Type == MediaStreamType.Video && string.Equals(videoStream.Codec, "h264", StringComparison.OrdinalIgnoreCase) &&

View File

@ -103,13 +103,6 @@ namespace MediaBrowser.MediaEncoding.Probing
}
ExtractTimestamp(info);
var videoStream = info.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Video);
if (videoStream != null && videoType == VideoType.VideoFile)
{
DetectInterlaced(info, videoStream);
}
}
return info;
@ -932,20 +925,5 @@ namespace MediaBrowser.MediaEncoding.Probing
return TransportStreamTimestamp.None;
}
private void DetectInterlaced(MediaSourceInfo video, MediaStream videoStream)
{
if (video.Protocol != MediaProtocol.File || videoStream == null)
{
return;
}
// Take a shortcut and limit this to containers that are likely to have interlaced content
if (!string.Equals(video.Container, "ts", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(video.Container, "wtv", StringComparison.OrdinalIgnoreCase))
{
return;
}
}
}
}