public void DvdInfoContainerTest() { var expectResult = new[] { new { Name = "Chapter 01", Time = "00:00:00.000" }, new { Name = "Chapter 02", Time = "00:17:42.500" }, new { Name = "Chapter 03", Time = "00:37:14.767" }, new { Name = "Chapter 04", Time = "00:56:24.167" }, new { Name = "Chapter 05", Time = "01:12:36.701" }, new { Name = "Chapter 06", Time = "01:32:26.268" }, new { Name = "Chapter 07", Time = "01:49:06.136" }, new { Name = "Chapter 08", Time = "01:49:06.636" } }; string path = @"..\..\[ifo_Sample]\VTS_05_0.IFO"; if (!File.Exists(path)) { path = @"..\" + path; } var result = new DvdInfoContainer(path).GetChapterInfo(); int index = 0; foreach (var chapter in result[0].Chapters) { Console.WriteLine(chapter); expectResult[index].Name.Should().Be(chapter.Name); expectResult[index].Time.Should().Be(chapter.Time.Time2String()); ++index; } }
public void GetDvdTitleList() { const string strChapters = "Chapters"; const string strVideo = "Video"; const string strAudio = "Audio"; const string strSubtitles = "Subtitles"; var dvd = new DvdInfoContainer(JobInfo.InputFile); foreach (var info in dvd.Titles) { int videoId = info.TitleNumber; var fps = info.VideoStream.Framerate; var videoFormat = info.VideoStream.VideoStandard.ToString(); var codec = _processingService.StringValueOf(info.VideoStream.CodingMode); var aspect = _processingService.StringValueOf(info.VideoStream.AspectRatio); var resolution = _processingService.StringValueOf(info.VideoStream.VideoResolution); var resolutionArray = resolution.Split(new[] { "x" }, StringSplitOptions.RemoveEmptyEntries); int width = 0, height = 0; try { int.TryParse(resolutionArray[0], out width); int.TryParse(resolutionArray[1], out height); } catch (Exception ex) { Log.Error(ex); } var letterboxed = _processingService.StringValueOf(info.VideoStream.DisplayFormat); int vtsID = info.TitleSetNumber; var duration = DateTime.MinValue.Add(info.VideoStream.Runtime); var treeRoot = $"Title: {videoId:0}, Length: {duration.ToString("H:mm:ss.fff")}"; var treeData = new Dictionary <string, object> { { "Name", JobInfo.InputFile }, { "TrackID", videoId } }; var root = new StreamTreeNode { ID = _treeNodeID++, Name = treeRoot, Data = treeData, Children = new List <StreamTreeNode>(), IsChecked = true, IsExpanded = true }; _tree.Add(root); var chaptersTree = CreateNode(root, strChapters, null); var videoTree = CreateNode(root, strVideo, null); var audioTree = CreateNode(root, strAudio, null); var subTree = CreateNode(root, strSubtitles, null); if (info.Chapters != null && info.Chapters.Count > 0) { var chaptersFormat = $"{info.Chapters.Count:0} {strChapters}"; CreateNode(chaptersTree, chaptersFormat, info.Chapters); } var videoStream = $"{codec} {resolution} {aspect} ({letterboxed}) {videoFormat} {fps:0.000} fps"; var vid = new VideoInfo { VtsId = vtsID, TrackId = videoId, StreamId = 1, Fps = fps, Interlaced = true, Format = codec, FrameCount = 0, Width = width, Height = height, Encoded = false, IsRawStream = false, DemuxStreamNames = new List <string>(), StreamSize = 0, Length = info.VideoStream.Runtime.TotalSeconds, FrameRateEnumerator = info.VideoStream.FrameRateNumerator, FrameRateDenominator = info.VideoStream.FrameRateDenominator, AspectRatio = info.VideoStream.AspectRatio == DvdVideoAspectRatio.Aspect4By3 ? 4f / 3f : 16f / 9f }; CreateNode(videoTree, videoStream, vid); foreach (var stream in info.AudioStreams) { var audioID = stream.StreamIndex; var langCode = stream.Language.Code; var language = stream.Language.Name; var format = _processingService.StringValueOf(stream.CodingMode); var frequency = stream.SampleRate; var quantization = _processingService.StringValueOf(stream.Quantization); var channels = stream.Channels; var content = _processingService.StringValueOf(stream.Extension); var streamID = stream.StreamId; var audioStream = $"Track {audioID:0} ({streamID:0}), {langCode} ({language} - {content}), {format} {channels:0} Channels {frequency:0} Hz, {quantization}"; var aud = new AudioInfo { Format = format, FormatProfile = string.Empty, Id = audioID, StreamId = streamID, LangCode = langCode, TempFile = string.Empty, OriginalId = audioID, Delay = 0, Bitrate = 0, SampleRate = frequency, ChannelCount = channels, ShortLang = langCode, StreamSize = 0, IsHdStream = false }; CreateNode(audioTree, audioStream, aud); } foreach (var stream in info.SubtitleStreams) { var subID = stream.StreamIndex; var langCode = stream.Language.Code; var language = stream.Language.Name; var content = _processingService.StringValueOf(stream.Extension); var streamID = stream.StreamId; var subtitleStream = $"Track {subID:0} ({streamID:0}), {langCode} ({language} - {content})"; var subInfo = new SubtitleInfo { Id = subID + info.AudioStreams.Count, StreamId = streamID, TempFile = string.Empty, LangCode = langCode, Format = "VobSub", Delay = 0, StreamSize = 0 }; CreateNode(subTree, subtitleStream, subInfo); } } int longestTrack = dvd.Titles.Single( info => info.VideoStream.Runtime == dvd.Titles.Max(infoLocl => infoLocl.VideoStream.Runtime)) .TitleNumber; _defaultSelection = longestTrack - 1; }