private Slide[] BuildThumbnailsUnix(ConversionConfiguration config, string slidesFileName) { var thumbOutDir = Path.Combine(config.OutputDirectory, "thumbs"); Directory.CreateDirectory(thumbOutDir); List <Slide> result = new List <Slide>(); try { dynamic projectJson = JsonConvert.DeserializeObject(File.ReadAllText(config.MetadataPath)); int currentId = 0; var keyframes = new List <TimeSpan>(); keyframes.Add(TimeSpan.Zero); foreach (string timestamp in projectJson["slides"]) { keyframes.Add(TimeSpan.Parse(timestamp)); } foreach (var keyframe in keyframes) { TimeSpan?nextKeyframe = null; if (keyframes.IndexOf(keyframe) != keyframes.Count - 1) { nextKeyframe = keyframes[keyframes.IndexOf(keyframe) + 1]; } else { nextKeyframe = FFmpegHelper.GetMediaLength(config.SlideVideoPath); } string thumbName = FFmpegHelper.ExportThumbnail((float)nextKeyframe.GetValueOrDefault().TotalSeconds - 2.0f, config.SlideVideoPath, thumbOutDir, (currentId++).ToString()); var tmpFileName = Path.Combine("/tmp", Path.GetRandomFileName()); var process = FFmpegHelper.BuildProcess("tesseract", Path.Combine(thumbOutDir, thumbName) + " \"" + tmpFileName + "\"", false); process.Start(); process.WaitForExit(); var ocr = File.ReadAllText(tmpFileName + ".txt"); File.Delete(tmpFileName + ".txt"); var slide = new Slide { StartPosition = (float)keyframe.TotalSeconds + 0.2f, Thumbnail = "thumbs/" + thumbName, Ocr = ocr }; if (keyframe.Equals(TimeSpan.Zero)) { slide.StartPosition = 0.0f; } result.Add(slide); } } catch (Exception ex) { _logger.LogError(ex.Message); } return(result.ToArray()); }