示例#1
0
 private void LoadSection(String sectionFile)
 {
     vfl.ClearSections();
     SectionParser.ParseSections(sectionFile, vfl);
     this.Text = String.Format("Section Editor - {0}", sectionFile);
     RefreshSectionList();
 }
示例#2
0
        public void CreateFromSections(String sectionsFile, String chaptersFile, Decimal frameRate, Boolean useChapters, Boolean isTrimFile)
        {
            //clear chapters
            chapterList.Clear();

            //If use chapters, load chapter file
            if (useChapters)
            {
                if (AcHelper.GetFilename(chaptersFile, GetFileNameMode.ExtensionOnly, GetDirectoryNameMode.NoPath).ToLowerInvariant() == "xml")
                {
                    Load(ChapterType.XML, chaptersFile);
                }
                else if (AcHelper.GetFilename(chaptersFile, GetFileNameMode.ExtensionOnly, GetDirectoryNameMode.NoPath).ToLowerInvariant() == "txt")
                {
                    Load(ChapterType.OGM, chaptersFile);
                }
            }

            //Create a Videoframelist
            vfl = new VideoFrameList();

            //Load the sections file
            SectionParser.ParseSections(sectionsFile, vfl);

            //Sanity check
            if (useChapters && vfl.CountSections != chapterList.Count)
            {
                throw new AcException("Error creating chapters! Sections count is different from the chapters count!");
            }

            if (isTrimFile)
            {
                Int32 framesToDelete = 0;
                for (Int32 i = 0; i < vfl.CountSections; i++)
                {
                    //If no chapters are loaded
                    if (!useChapters)
                    {
                        //Create new empty chapter
                        VideoChapter chap = new VideoChapter();
                        chapterList.Add(chap);
                    }

                    if (i == 0)
                    {
                        Int32 start = 0;
                        Int32 end   = vfl.FrameSections[i].FrameEnd;
                        framesToDelete           = vfl.FrameSections[0].FrameStart;
                        end                     -= framesToDelete;
                        chapterList[i].StartTime = VideoFrame.FrameTimeFromFrameNumber(start, frameRate, FrameFromType.FromFrameRate);
                        chapterList[i].EndTime   = VideoFrame.FrameTimeFromFrameNumber(Convert.ToDecimal(end) + 0.5m,
                                                                                       frameRate, FrameFromType.FromFrameRate);
                    }
                    else
                    {
                        Int32 start   = vfl.FrameSections[i].FrameStart;
                        Int32 end     = vfl.FrameSections[i].FrameEnd;
                        Int32 prevEnd = vfl.FrameSections[i - 1].FrameEnd;
                        framesToDelete          += start - prevEnd - 1;
                        start                   -= framesToDelete;
                        end                     -= framesToDelete;
                        chapterList[i].StartTime = VideoFrame.FrameTimeFromFrameNumber(Convert.ToDecimal(start) + 0.5m,
                                                                                       frameRate, FrameFromType.FromFrameRate);
                        chapterList[i].EndTime = VideoFrame.FrameTimeFromFrameNumber(Convert.ToDecimal(end) + 0.5m,
                                                                                     frameRate, FrameFromType.FromFrameRate);
                    }
                }
            }
            else
            {
                for (Int32 i = 0; i < vfl.CountSections; i++)
                {
                    //If no chapters are loaded
                    if (!useChapters)
                    {
                        //Create new empty chapter
                        VideoChapter chap = new VideoChapter();
                        chapterList.Add(chap);
                    }

                    Int32 start = vfl.FrameSections[i].FrameStart;
                    Int32 end   = vfl.FrameSections[i].FrameEnd;
                    chapterList[i].StartTime = VideoFrame.FrameTimeFromFrameNumber(Convert.ToDecimal(start) + 0.5m,
                                                                                   frameRate, FrameFromType.FromFrameRate);
                    chapterList[i].EndTime = VideoFrame.FrameTimeFromFrameNumber(Convert.ToDecimal(end) + 0.5m,
                                                                                 frameRate, FrameFromType.FromFrameRate);
                }
            }
        }
示例#3
0
 /// <summary>
 /// Load sections from a sections/trims file
 /// </summary>
 /// <param name="sectionsFile"></param>
 public void LoadSections(String sectionsFile)
 {
     SectionParser.ParseSections(sectionsFile, this);
 }
示例#4
0
文件: frmAss.cs 项目: Gpower2/AcTools
        private void btnSplit_Click(object sender, EventArgs e)
        {
            try
            {
                AssParser assP = new AssParser();
                assP.ParseASS(txtAssFile.Text);
                VideoFrameList vfl = new VideoFrameList();
                SectionParser.ParseSections(txtSectionsFile.Text, vfl);
                Decimal framerate = AcHelper.DecimalParse(txtFramerate.Text);
                foreach (AssDialogue assD in assP.AssContents)
                {
                    Decimal timeToDelete = 0;
                    for (Int32 currentSection = 0; currentSection < vfl.FrameSections.Count; currentSection++)
                    {
                        VideoFrameSection vfs          = vfl.FrameSections[currentSection];
                        Decimal           startSection = VideoFrame.GetStartTimeFromFrameNumber(vfs.FrameStart, framerate);
                        Decimal           endSection   = VideoFrame.GetStartTimeFromFrameNumber(vfs.FrameEnd, framerate);
                        //Check if the sub ends before the section
                        if (assD.time_end_double <= startSection)
                        {
                            assD.deleted = true;
                            break;
                        }
                        //Check if the sub starts after the section
                        if (assD.time_start_double >= endSection)
                        {
                            //If its the last sections, then delete the sub
                            if (currentSection == vfl.FrameSections.Count - 1)
                            {
                                assD.deleted = true;
                                break;
                            }
                            else
                            {
                                continue;
                            }
                        }
                        //Time to resync the sub
                        if (currentSection == 0)
                        {
                            TimeSpan ts;
                            timeToDelete           = startSection;
                            assD.time_start_double = assD.time_start_double - timeToDelete;
                            ts = TimeSpan.FromMilliseconds(Convert.ToDouble(assD.time_start_double));
                            assD.time_start = ts.Hours.ToString("0") + ":" + ts.Minutes.ToString("00")
                                              + ":" + ts.Seconds.ToString("00") + "." + ts.Milliseconds.ToString("00");

                            assD.time_end_double = assD.time_end_double - timeToDelete;
                            ts            = TimeSpan.FromMilliseconds(Convert.ToDouble(assD.time_end_double));
                            assD.time_end = ts.Hours.ToString("0") + ":" + ts.Minutes.ToString("00")
                                            + ":" + ts.Seconds.ToString("00") + "." + ts.Milliseconds.ToString("00");
                            break;
                        }
                        else
                        {
                            TimeSpan ts;
                            Decimal  start   = startSection;
                            Decimal  end     = endSection;
                            Decimal  prevEnd = VideoFrame.GetStartTimeFromFrameNumber(vfl.FrameSections[currentSection - 1].FrameEnd, framerate);
                            timeToDelete          += start - prevEnd - VideoFrame.GetDurationFromFrameRate(framerate);
                            assD.time_start_double = assD.time_start_double - timeToDelete;
                            ts = TimeSpan.FromMilliseconds(Convert.ToDouble(assD.time_start_double));
                            assD.time_start = ts.Hours.ToString("0") + ":" + ts.Minutes.ToString("00")
                                              + ":" + ts.Seconds.ToString("00") + "." + ts.Milliseconds.ToString("00");

                            assD.time_end_double = assD.time_end_double - timeToDelete;
                            ts            = TimeSpan.FromMilliseconds(Convert.ToDouble(assD.time_end_double));
                            assD.time_end = ts.Hours.ToString("0") + ":" + ts.Minutes.ToString("00")
                                            + ":" + ts.Seconds.ToString("00") + "." + ts.Milliseconds.ToString("00");
                            break;
                        }
                    }
                }
                assP.WriteFinalAss(txtAssFile.Text.Substring(0, txtAssFile.Text.LastIndexOf(".") - 1) + ".resync.ass");
                MessageBox.Show("Resync complete!", "Success!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error!");
            }
        }