diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2015-12-19 11:46:32 -0500 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2015-12-19 11:46:32 -0500 |
| commit | 5c610d71f61f4f834a07102e9947d847f6a4efbf (patch) | |
| tree | 4c87d95cb16c7f54d2df766a1571ccbe5fa63db6 /MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs | |
| parent | 940702aa0b0927f8826a3eaddbedf0ed6524ad25 (diff) | |
remove call from probe result normalizer
Diffstat (limited to 'MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs')
| -rw-r--r-- | MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs index c8361ea04..d4a626da0 100644 --- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs @@ -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) && |
