Example #1
0
        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();
        }
Example #2
0
		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}");
		}
Example #3
0
        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);
            }
        }
Example #4
0
		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");
			}
		}