private void UpdateCropSizeInfo() { if (inputFile == null) { labelCropSize.Text = ""; return; } if (PictureConfig.IsCropped()) { labelCropSize.Text = $"{PictureConfig.InputDisplaySize.ToString()} → {PictureConfig.CropSize.ToString()}"; } else { labelCropSize.Text = ""; } }
private void SetInputFile(string path) { try { ValidateInputFile(path); inputFile = new InputFile(path); inputFile.Probe(); } catch (Exception ex) { inputFile = null; textBoxIn.Text = "Файл не выбран"; textBoxOut.Text = ""; buttonGo.Enabled = false; buttonPreview.Enabled = false; buttonShowInfo.Enabled = false; buttonOpenInputFile.Enabled = false; ToggleTabs(); // reset PictureConfig.Reset(); UpdateCropSizeInfo(); CalcFileSize(); SetOutputInfo(); ClearTags(); ResetCrop(); sizeChanged = false; textBoxSubtitlesPath.Text = ""; Text = formTitle; MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Hand); return; } #if DEBUG Console.WriteLine(inputFile.StreamInfo); #endif textBoxIn.Text = path; Properties.Settings.Default.InPath = Path.GetDirectoryName(path); ToggleTabs(); Text = Path.GetFileName(path) + " - " + formTitle; VideoStream vStream = inputFile.VideoStreams[0]; PictureConfig.Reset(); PictureConfig.InputOriginalSize = vStream.OriginalSize; PictureConfig.InputDisplaySize = vStream.PictureSize; numericUpDownHeight.Value = Math.Max(PictureConfig.CropSize.Height, PictureConfig.MinHeight); numericUpDownWidth.Value = Math.Max(PictureConfig.CropSize.Width, PictureConfig.MinWidth); // triggered UpdateHeight() if keeping ar numericCropTop.Maximum = PictureConfig.InputOriginalSize.Height; numericCropBottom.Maximum = PictureConfig.InputOriginalSize.Height; numericCropLeft.Maximum = PictureConfig.InputOriginalSize.Width; numericCropRight.Maximum = PictureConfig.InputOriginalSize.Width; ResetCrop(); // set original aspect ratio FillComboBoxAspectRatio(true); sizeChanged = false; // reset after wet WxH in numericUpDown // if need deinterlace PictureConfig.Deinterlace = checkBoxDeinterlace.Checked = vStream.FieldOrder != "progressive"; comboBoxFieldOrder.SelectedIndex = 0; // TODO: get from Picture ManageCheckPanel(checkBoxDeinterlace, panelDeinterlace); ResetRotateAndFlip(); comboBoxFrameRate.SelectedIndex = 0; CheckVideoMustConvert(); // fill audio streams FillAudioStreams(); // show info SetInputInfo(); CalcFileSize(); buttonGo.Enabled = true; buttonPreview.Enabled = true; buttonShowInfo.Enabled = true; buttonOpenInputFile.Enabled = true; UpdateCropSizeInfo(); SetOutputInfo(); SetTagsFromInputFile(); textBoxSubtitlesPath.Text = ""; try { string outDir = ""; string withoutExtension = Path.GetFileNameWithoutExtension(path); if (checkBoxKeepOutPath.Checked) { if (!string.IsNullOrWhiteSpace(textBoxOut.Text)) { outDir = Path.GetDirectoryName(textBoxOut.Text); } else if (!string.IsNullOrWhiteSpace(Properties.Settings.Default.OutPath)) { outDir = Properties.Settings.Default.OutPath; } } if (string.IsNullOrWhiteSpace(outDir) || !Directory.Exists(outDir)) { outDir = Path.GetDirectoryName(path); } Properties.Settings.Default.OutPath = outDir; string outPath = Path.Combine(outDir, withoutExtension + "." + fileType); int num = 2; while (File.Exists(outPath)) { outPath = Path.Combine(outDir, withoutExtension + " (" + num.ToString() + ")." + fileType); num++; // if so many duplicates set name manually if (num > 100) { break; } } textBoxOut.Text = outPath; } catch (Exception) { } }
/// <summary> /// Create content for "vf" argument /// </summary> /// <param name="subtitlesPath"></param> /// <returns></returns> private string GetVideoFilters(string subtitlesPath) { List <string> filters = new List <string>(); // https://ffmpeg.org/ffmpeg-filters.html#yadif-1 if (PictureConfig.Deinterlace) { filters.Add($"yadif=parity={PictureConfig.FieldOrder}"); } // https://ffmpeg.org/ffmpeg-filters.html#crop if (PictureConfig.IsCropped()) { // using oar int cropW = PictureConfig.InputOriginalSize.Width - PictureConfig.Crop.Left - PictureConfig.Crop.Right; int cropH = PictureConfig.InputOriginalSize.Height - PictureConfig.Crop.Top - PictureConfig.Crop.Bottom; filters.Add($"crop={cropW}:{cropH}:{PictureConfig.Crop.Left}:{PictureConfig.Crop.Top}"); } // https://ffmpeg.org/ffmpeg-filters.html#scale-1 if (PictureConfig.OutputSize.Width != PictureConfig.CropSize.Width || PictureConfig.OutputSize.Height != PictureConfig.CropSize.Height) { // https://www.ffmpeg.org/ffmpeg-scaler.html#sws_005fflags filters.Add($"scale={PictureConfig.OutputSize.Width}x{PictureConfig.OutputSize.Height}:flags={PictureConfig.Interpolation}"); } else if (PictureConfig.IsUsingDAR()) { // force scale for not square pixels filters.Add($"scale={PictureConfig.CropSize.Width}x{PictureConfig.CropSize.Height}:flags={PictureConfig.Interpolation}"); } // https://ffmpeg.org/ffmpeg-filters.html#pad-1 /*if (PictureConfig.Padding.X > 0 || PictureConfig.Padding.Y > 0) * { * filters.Add($"pad={PictureConfig.SelectedSize.Width}:{PictureConfig.SelectedSize.Height}:{PictureConfig.Padding.X}:{PictureConfig.Padding.Y}"); * }*/ // https://ffmpeg.org/ffmpeg-filters.html#transpose if (PictureConfig.Rotate == 180) { filters.Add("transpose=2,transpose=2"); } else if (PictureConfig.Rotate == 90) { filters.Add("transpose=1"); } else if (PictureConfig.Rotate == 270) { filters.Add("transpose=2"); } // https://ffmpeg.org/ffmpeg-filters.html#hflip if (PictureConfig.Flip) { filters.Add("hflip"); } // Set subtitles // https://trac.ffmpeg.org/wiki/HowToBurnSubtitlesIntoVideo if (!string.IsNullOrWhiteSpace(subtitlesPath) && File.Exists(subtitlesPath)) { // https://ffmpeg.org/ffmpeg-filters.html#Notes-on-filtergraph-escaping filters.Add($"subtitles={subtitlesPath.Replace("\\", "\\\\\\\\").Replace("'", "\\\\\\'").Replace(":", "\\\\:").Replace(",", "\\,")}"); } // force sar 1:1 // https://ffmpeg.org/ffmpeg-filters.html#setdar_002c-setsar filters.Add("setsar=sar=1/1"); // color filter // https://ffmpeg.org/ffmpeg-filters.html#colorchannelmixer if (PictureConfig.ColorChannelMixerList.ContainsKey(PictureConfig.ColorFilter)) { filters.Add($"colorchannelmixer={PictureConfig.ColorChannelMixerList[PictureConfig.ColorFilter]}"); } return(string.Join(",", filters)); }