Exemplo n.º 1
0
 public void AddFootage(string footageSource, Footage footage)
 {
     if (!Footage.Keys.Contains(footageSource))
     {
         Footage.Add(footageSource, new List <Footage>());
     }
     Footage[footageSource].Add(footage);
 }
Exemplo n.º 2
0
        static public Footage Factory(FileInfo path)
        {
            switch (path.Extension.ToUpper())
            {
            case ".MP4":
            {
                Footage footage = null;
                var     v       = Program.GetInfo(path.FullName);
                var     s       = v.streams?.Where(vv => vv.codec_type == "video").FirstOrDefault();
                if (s != null)
                {
                    var cd = s.Tags["creation_time"];

                    if (path.FullName.Contains("pixel"))
                    {
                        footage = new Footage
                        {
                            FileName   = path.FullName,
                            CreateDate = Convert.ToDateTime(cd),
                            Duration   = s.duration
                        };
                    }
                    else
                    {
                        footage = new Footage
                        {
                            FileName   = path.FullName,
                            CreateDate = Convert.ToDateTime(cd).AddHours(5),         // gopro always returns UTC //
                            Duration   = s.duration
                        };
                    }
                }
                return(footage);
            }

            case ".AVI":
            {
                Footage footage = null;
                var     v       = Program.GetAviDuration(path.FullName);
                //var s = v.streams?.Where(vv => vv.codec_type == "video").FirstOrDefault();
                if (v > 0)
                {
                    var cd = path.LastWriteTime;


                    footage = new Footage
                    {
                        FileName   = path.FullName,
                        CreateDate = Convert.ToDateTime(cd),
                        Duration   = v
                    };
                }
                return(footage);
            }

            default: return(null);
            }
        }
Exemplo n.º 3
0
 public bool CheckAddFootage(string footageSource, Footage footage)
 {
     if (footage.Within(CreateDate))
     {
         AddFootage(footageSource, footage);
         return(true);
     }
     return(false);
 }
Exemplo n.º 4
0
        static void ProcessFolder(string folder)
        {
            // output each trigger and which footage files that contain it
            // output lists of footage folders in chronological order
            // output list of everything in chronological order

            var triggers     = new List <Trigger>();
            var footageList  = new Dictionary <string, IList <Footage> >();
            var clipList     = new List <Clip>();
            var combineComps = new List <string>();

            foreach (var d in Directory.EnumerateDirectories(folder))
            {
                Console.WriteLine(d);
                if (d.Contains("iPhone") || d.Contains("Android"))
                {
                    // load triggers
                    foreach (var f in (new DirectoryInfo(d)).EnumerateFiles())
                    {
                        if (f.Extension.ToUpper() == ".JPG")
                        {
                            var pu  = new RandomWayfarer.Pictures.PictureUtils();
                            var pic = pu.GetJpegPicture(f.FullName);
                            if (pic != null)
                            {
                                triggers.Add(new Trigger
                                {
                                    CreateDate = pic.DateTime,
                                    FileName   = f.FullName
                                });
                            }
                            else
                            {
                                Console.WriteLine($"Invalid {f.FullName}");
                            }
                        }
                        else if (f.Extension.ToUpper() == ".MOV")
                        {
                            var v  = GetInfo(f.FullName);
                            var s  = v.streams.Where(vv => vv.codec_type == "video").First();
                            var cd = s.Tags["creation_time"];
                            triggers.Add(new Trigger
                            {
                                FileName   = f.FullName,
                                CreateDate = Convert.ToDateTime(cd)
                            });
                        }
                    }
                }
                else
                {
                    var footage           = new List <Footage>();
                    var ff                = Path.GetFullPath(d);
                    var footageSourceName = ff.Split('\\').Reverse().First();
                    footageList.Add(footageSourceName, footage);
                    // load footage files
                    foreach (var ext in new string[] { "*.mp4", "*.avi", "*.mov" })
                    {
                        foreach (var f in (new DirectoryInfo(d)).EnumerateFiles(ext))//.mp4
                        {
                            var foot = Footage.Factory(f);
                            if (foot != null)
                            {
                                footage.Add(foot);
                            }
                            else
                            {
                                Console.WriteLine($"INVALID : {f.FullName}");
                            }
                        }
                    }
                }
            }

            //each camera for a single trigger makes a "clip." clips can be made of multiple vids
            foreach (var trig in triggers)
            {
                trig.ParamStart = trig.CreateDate - new TimeSpan(0, 0, before);
                trig.ParamEnd   = trig.CreateDate + new TimeSpan(0, 0, after);

                foreach (var camera in footageList)
                {
                    var clip = new Clip
                    {
                        InitTrigger    = trig,
                        CameraName     = camera.Key,
                        OutputName     = "output",
                        StartTime      = trig.ParamStart,
                        EndTime        = trig.ParamEnd,
                        NecessaryFiles = new List <Footage>()
                    };

                    foreach (var vid in camera.Value)
                    {
                        if (vid.Contains(clip.StartTime) || vid.Contains(clip.EndTime))
                        {
                            clip.NecessaryFiles.Add(vid);
                        }
                        else if (clip.Contains(vid.CreateDate))
                        {
                            clip.NecessaryFiles.Add(vid);
                        }
                    }
                    if (clip.NecessaryFiles.Count > 0)
                    {
                        clipList.Add(clip);
                    }
                }
            }

            //makes each clip from source footage, 2 files if necessary, might work with 3+, does it need to?
            var clipNum = 0;

            foreach (var clip in clipList)
            {
                string endOutput = "";
                clipNum++;
                clip.SplitParameters = new SplitParameters(
                    clip.NecessaryFiles.FirstOrDefault().FileName,
                    ((clip.InitTrigger.CreateDate - clip.NecessaryFiles.FirstOrDefault().CreateDate) - tsBefore),
                    tsBefore + tsAfter,
                    $"( {clipNum.ToString()} )" + clip.InitTrigger.OutputPrefix + clip.CameraName
                    );


                if (clip.NecessaryFiles.Count == 1)
                {
                    endOutput = Split(clip.SplitParameters);
                }
                else if (clip.NecessaryFiles.Count == 0)
                {
                    //delete clip
                }
                else
                {
                    int fileNum = 0;
                    foreach (var vid in clip.NecessaryFiles)
                    {
                        fileNum++;
                        vid.SplitParameters = new SplitParameters(
                            vid.FileName,
                            ((clip.InitTrigger.CreateDate - vid.CreateDate) - tsBefore),
                            tsBefore + tsAfter,
                            $"( {fileNum.ToString()} )" + vid.OutputPrefix
                            );

                        if (vid.Contains(clip.InitTrigger.ParamStart))
                        {
                            vid.SplitParameters.Duration = vid.EndDate - clip.InitTrigger.ParamStart;
                        }
                        if (vid.Contains(clip.InitTrigger.ParamEnd))
                        {
                            if (vid.Contains(clip.InitTrigger.ParamStart)) /*error I don't think this should happen */ Console {