2
0
Эх сурвалжийг харах

remove call from probe result normalizer

Luke Pulverenti 9 жил өмнө
parent
commit
5c610d71f6

+ 77 - 0
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) &&

+ 0 - 22
MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs

@@ -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;
-            }
-        }
     }
 }