static void Main(string[] args) { var info = new FFmpeg.Stream(@"D:\Users\Anime4000\Videos\ASDF COMP- BALLZ.mp4"); string fmtName = info.FormatName; string fmtName2 = info.FormatNameFull; float time = info.Duration; ulong size = info.FileSize; // in bytes ulong bitRate = info.BitRate; // in bits Console.WriteLine($"Format: {fmtName} ({fmtName2}),\nSize: {size}bytes,\nBitrate: {bitRate}bps,\nLength: {time}sec\n"); foreach (var item in info.Video) { Console.Write($"ID : {item.Id}\n"); Console.Write("Type : Video\n"); Console.Write($"Language : {item.Language}\n"); Console.Write($"Codec : {item.Codec}\n"); Console.Write($"Pixel Format : {item.PixelFormat}\n"); Console.Write($"Bit per Colour : {item.BitPerColour}\n"); Console.Write($"Resolution : {item.Width}x{item.Height}\n"); Console.Write($"Frame Rate : {item.FrameRate:#.##}fps\n"); Console.Write($"Frame Rate Avg : {item.FrameRateAvg:#.##}fps\n"); Console.Write($"Frame Rate Mode : {(item.IsConstantFrameRate ? "Constant" : "Variable")}\n"); Console.Write($"Frame Count : {item.FrameCount} frame's\n"); Console.Write($"\n"); } foreach (var item in info.Audio) { Console.Write($"ID : {item.Id}\n"); Console.Write("Type : Audio\n"); Console.Write($"Language : {item.Language}\n"); Console.Write($"Codec : {item.Codec}\n"); Console.Write($"Sample Rate : {item.SampleRate}Hz\n"); Console.Write($"Bit Depth : {item.BitDepth} Bit (raw)\n"); Console.Write($"Channels : {item.Channel}\n"); Console.Write($"\n"); } foreach (var item in info.Subtitle) { Console.Write($"ID : {item.Id}\n"); Console.Write("Type : Subtitle\n"); Console.Write($"Language : {item.Language}\n"); Console.Write($"Codec : {item.Codec}\n"); Console.Write($"\n"); } foreach (var item in info.Attachment) { Console.Write($"Attachment: {item.Id}, {item.FileName}, {item.MimeType}\n"); } Console.Read(); }
void QueueAdd(string file) { if (Get.IsPathNetwork(file)) { InvokeLog($"This file from Network, please mount, rejected: {file}"); return; } FFmpeg.Bin = Plugin.FFMPEG; FFmpeg.Probe = Plugin.FFPROBE; var Info = new Queue(); var i = cboProfile.SelectedIndex; // Profiles var p = Profile.List[i == 0 ? 0 : i - 1]; // When profiles at <new> mean auto detect // todo var ff = new FFmpeg.Stream(file); Info.FilePath = file; Info.General.IsOutputMKV = i == 0 ? true : string.Equals(p.Info.Format, "mkv", IC); Info.General.IsAviSynth = string.Equals(ff.FormatName, "avisynth", IC); Info.General.Duration = ff.Duration; if (ff.Video.Count > 0) { // Picture section Info.Picture.FrameCount = ff.Video[0].FrameCount; Info.Picture.Resolution = i == 0 ? "auto" : p.Picture.Resolution; Info.Picture.FrameRate = i == 0 ? "auto" : p.Picture.FrameRate; Info.Picture.BitDepth = i == 0 ? ff.Video[0].BitPerColour : p.Picture.BitDepth; Info.Picture.Chroma = i == 0 ? 420 : p.Picture.Chroma; } else { InvokeLog($"This file has no video, rejected: {file}"); return; } // Video section Info.Video.Preset = i == 0 ? "medium" : p.Video.Preset; Info.Video.Tune = i == 0 ? "off" : p.Video.Tune; Info.Video.Type = i == 0 ? 0 : p.Video.Type; Info.Video.Value = i == 0 ? "26" : p.Video.Value; Info.Video.Command = i == 0 ? "--dither" : p.Video.Command; // Audio section Plugin dummy; bool exist = Plugin.List.TryGetValue(p.Audio.Encoder, out dummy); Guid encoder = i == 0 || !exist ? new Guid("ffffffff-ffff-ffff-ffff-ffffffffffff") : p.Audio.Encoder; string bitRate = i == 0 || !exist ? "256" : p.Audio.BitRate; string frequency = i == 0 || !exist ? "auto" : p.Audio.Freq; string channel = i == 0 || !exist ? "auto" : p.Audio.Chan; string command = i == 0 || !exist ? null : p.Audio.Args; foreach (var item in ff.Audio) Info.Audio.Add(new Queue.audio { Enable = true, File = file, Embedded = true, Id = item.Id, Lang = item.Language, Codec = item.Codec, Format = Get.MediaContainer(item.Codec), RawBit = item.BitDepth, RawFreq = item.SampleRate, RawChan = item.Channel, Encoder = encoder, BitRate = bitRate, Freq = frequency, Chan = channel, Args = command }); // Subtitle Info.SubtitleEnable = ff.Subtitle.Count > 0; foreach (var item in ff.Subtitle) { Info.Subtitle.Add(new Queue.subtitle { File = file, Id = item.Id, Lang = item.Language, Codec = item.Codec, Format = Get.MediaContainer(item.Codec), }); } // Add to queue list ListViewItem qItem = new ListViewItem(new[] { Get.FileName(file), Get.FileSize(file), ff.FormatNameFull, Info.General.IsOutputMKV ? "Matroska" : "MPEG-4", "Ready" }); qItem.Tag = Info; qItem.Checked = true; lstQueue.Items.Add(qItem); // Print to log InvokeLog($"File added {Info.FilePath}"); }
private void QueueAdd(string filePath) { var qi = new Queue(); var mi = new FFmpeg.Stream(filePath); qi.Properties = mi; if (mi.Video.Count > 0 || mi.Audio.Count > 0) { qi.Enable = true; qi.MkvOut = true; foreach (var item in mi.Video) { qi.Video.Add(new QueueVideo { File = filePath, Id = item.Id, Lang = item.Language, Format = Get.CodecFormat(item.Codec), Width = item.Width, Height = item.Height, FrameRate = item.FrameRate, BitDepth = item.BitDepth, Chroma = item.Chroma, Deinterlace = false, DeinterlaceField = 0, DeinterlaceMode = 0, Encoder = new Guid("deadbeef-0265-0265-0265-026502650265"), EncoderPreset = "medium", EncoderTune = "psnr", EncoderRateControl = 0, EncoderRateValue = 26, EncoderMultiPass = 1, EncoderArgs = "--pme --pmode", }); } foreach (var item in mi.Audio) { qi.Audio.Add(new QueueAudio { File = filePath, Id = item.Id, Lang = item.Language, Format = Get.CodecFormat(item.Codec), BitDepth = item.BitDepth, // use for decoding, hidden from GUI Encoder = new Guid("deadbeef-faac-faac-faac-faacfaacfaac"), EncoderMode = 0, EncoderValue = "128", EncoderSampleRate = item.SampleRate, EncoderChannel = item.Channel, EncoderArgs = "", }); } foreach (var item in mi.Subtitle) { qi.Subtitle.Add(new QueueSubtitle { File = filePath, Id = item.Id, Lang = item.Language, Format = Get.CodecFormat(item.Codec), }); } // add to queue ListViewItem lst = new ListViewItem(new[] { Path.GetFileName(filePath), TimeSpan.FromSeconds(mi.Duration).ToString("hh\\:mm\\:ss"), "MKV", "Ready", }); lst.Tag = qi; lst.Checked = true; lstQueue.Items.Add(lst); } }
public static void Extract(Queue item) { if (string.IsNullOrEmpty(item.FilePath)) return; int count = 0; if (item.General.IsAviSynth) { if (Default.AvsMkvCopy) { var file = GetStream.AviSynthGetFile(item.FilePath); var ff = new FFmpeg.Stream(file); foreach (var subs in ff.Subtitle) TaskManager.Run($"\"{Plugin.FFMPEG}\" -i \"{file}\" -map 0:{subs.Id} -y subtitle{count++:D4}_{subs.Language}.{Get.MediaContainer(subs.Codec)}"); TaskManager.Run($"\"{Plugin.FFMPEG}\" -dump_attachment:t \"\" -i \"{file}\" -y"); TaskManager.Run($"\"{Plugin.MKVEXT}\" chapters \"{file}\" > chapters.xml"); } if (item.SubtitleEnable) { foreach (var subs in item.Subtitle) { if (File.Exists(subs.File)) { if (subs.Id < 0) { File.Copy(subs.File, Path.Combine(Default.DirTemp, $"subtitle{count++:D4}_{subs.Lang}.{subs.Format}"), true); } } } } if (item.AttachEnable) { foreach (var font in item.Attach) { if (File.Exists(font.File)) { File.Copy(font.File, Path.Combine(Default.DirTemp, Get.FileName(font.File)), true); } } } } else { if (item.SubtitleEnable) { foreach (var subs in item.Subtitle) { if (File.Exists(subs.File)) { if (subs.Id > -1) { TaskManager.Run($"\"{Plugin.FFMPEG}\" -i \"{subs.File}\" -map 0:{subs.Id} -y subtitle{count++:D4}_{subs.Lang}.{subs.Format}"); } else { File.Copy(subs.File, Path.Combine(Default.DirTemp, $"subtitle{count++:D4}_{subs.Lang}.{subs.Format}"), true); } } } } if (item.AttachEnable) { foreach (var font in item.Attach) { if (File.Exists(font.File)) { File.Copy(font.File, Path.Combine(Default.DirTemp, Get.FileName(font.File)), true); } } } else { TaskManager.Run($"\"{Plugin.FFMPEG}\" -dump_attachment:t \"\" -i \"{item.FilePath}\" -y"); } TaskManager.Run($"\"{Plugin.MKVEXT}\" chapters \"{item.FilePath}\" > chapters.xml"); } }