Любые предложения о том, как очистить этот запутанный вид-файл способ?


Я работаю на набор методов, найдите запись с камер наблюдения, видеорегистратор, основанный на timestaps.

Файлы имеют следующий формат:

\\\\\--.

Пример: Z:\2011\07\02\000001\00-13-15.mkv через Z:\2011\07\02\000001\23-45-13.mkv

Видео в 15ish минут, которые начинаются примерно на рубеже часа. На крайний случай, как вы могли себе представить, что очередь за час. Я придумал два способа, которые получают выполненную работу, но очень витиевато, и откровенно уродливые.

Может кто-нибудь придумать более простой способ сделать это?

Редактировать: после некоторых размышлений, я рефакторинг его в три метода. Разделить здание путь, как у меня с именем файла. Это лучше, но я все равно чувствую, что может быть проще. Это также устраняет изменения выпуска день я упомянул ниже.

    public static string GetSecurityFootage(DateTime timeStamp, Camera camera)
    {
        string storageLoc = Initialization.DvrStorageLocation;

        // Just bail if we don't have a valid storage location.
        if (!Directory.Exists(storageLoc))
        {
            return "";
        }

        // Get path and file name based on timestamp.
        string path = GetVideoPath(timeStamp, camera, storageLoc);
        string fileName = GetVideo(timeStamp, path.ToString());

        if (fileName != "" && File.Exists(path + fileName))
        {
            path = path + fileName;
        }

        // Try the end of the last hour/day.
        else
        {
            // Subtract from time minutes +1 to set time to last hour.
            timeStamp = timeStamp.AddMinutes(-(timeStamp.Minute + 1));

            path = GetVideoPath(timeStamp, camera, storageLoc);
            fileName = GetVideo(timeStamp, path.ToString());

            if (fileName != "" && File.Exists(path + fileName))
            {
                path = path + fileName;
            }
            else
            {
                // If it's not it the last hour, we do not have footage.
                return "";
            }
        }

        return path;
    }

    private static string GetVideoPath(DateTime timeStamp, Camera camera, string storageLoc)
    {
        string pathSep = Path.DirectorySeparatorChar.ToString();
        string cameraPath = "";

        string year = timeStamp.Year.ToString();
        string month = timeStamp.Month.ToString();
        string day = timeStamp.Day.ToString();

        StringBuilder path = new StringBuilder();

        // Paths are preceded by 0.
        if (day.Length == 1)
        {
            day = "0" + day;
        }

        if (month.Length == 1)
        {
            month = "0" + month;
        }

        switch (camera)
        {
            case Camera.Patio:
                cameraPath = "000001";
                break;

            case Camera.Counter:
                cameraPath = "000002";
                break;

            case Camera.Shed:
                cameraPath = "000003";
                break;

            case Camera.Cafe:
                cameraPath = "000004";
                break;

            case Camera.Lobby:
                cameraPath = "000005";
                break;

            default:
                cameraPath = "000002";  //default to counter.
                break;
        }

        // Path to video.
        path.Append(storageLoc);

        if (!storageLoc.Trim().EndsWith(pathSep))
        {
            path.Append(pathSep);
        }

        path.Append(year);
        path.Append(pathSep);
        path.Append(month);
        path.Append(pathSep);
        path.Append(day);
        path.Append(pathSep);
        path.Append(cameraPath);
        path.Append(pathSep);


        // The path doesn't exist, we will not have footage.
        if (!Directory.Exists(path.ToString()))
        {
            return "";
        }

        return path.ToString();
    }

    private static string GetVideo(DateTime timeStamp, string path)
    {
        string hour = timeStamp.Hour.ToString();
        int minute = timeStamp.Minute; //leave as int for comparison.

        string fileName = "";

        if (hour.Length == 1)
        {
            hour = "0" + hour;
        }

        // Get all the files in the dir, but just the file names.
        var files = Directory.GetFiles(path.ToString()).Select(f => Path.GetFileName(f));

        // All files that start with the correct hour.
        var q = from f in files
                where f.Trim().StartsWith(hour)
                orderby f
                select f;

        // Now, loop the files for the higest that is still less than the minute we're looking for.
        foreach (var file in q)
        {
            int min = 0;
            int.TryParse(file.Substring(3, 2), out min);

            // Set file name for each loop; when done the highest should always be the last one set.
            if (min <= minute)
            {
                fileName = file;
            }
        }

        return fileName;
    }

Я думаю, нет удара-через... учитывать следующее:

Единственное, что заметно, что за сменой дня, он не сможет найти запись. В этом нет ничего особенного, это лишь удобная возможность для наших поз. В этом случае пользователь будет просто просматривать видео вручную. Смены час-это важно, в противном случае эта функция бесполезна 1/4 часть времени.



321
1
c#
задан 27 июля 2011 в 02:07 Источник Поделиться
Комментарии
3 ответа

Глядя на то, как вы пытаетесь решить эту проблему, вы пытаетесь угадать ожидаемое имя файла
эта точка во времени. Позвольте мне предложить иной подход, который является более естественным и проще ИМХО.

Если все эти ролики сортируются, а кадры в видео, если это метка времени в течение времени этого видео, например, если у вас есть видео Z:\2011\07\02\000001\13-45-13.mkv а следующем видео Z:\2011\07\02\000001\14-00-32.mkvи вы ищете кадры на 2011-07-02 13:52:07, вы знаете, что кадры это в первый.

Для этого нужно


  1. Сортировать видео по дате начала (который вы получите в результате разбора имени).

  2. Поиск видео, содержащие эти кадры временных меток.

Это также обрабатывает все свои пограничные случаи :).

Но у меня еще есть некоторые замечания по поводу вашего кода.


  1. Не делай путь.Метод toString() , когда путь - это уже строка.

  2. Строку.формат является более читабельным, чем то StringBuilder в вашем случае.

  3. Что если добавить еще одну камеру? Вам придется модифицировать и перекомпилировать код. Рассмотрим определение камер наружно.

5
ответ дан 28 июля 2011 в 02:07 Источник Поделиться

Строку.IsnullOrEmpty вместо пустой строки сравнения. Также немедленно вернуться в свой если и снять еще, положите еще содержание в отдельном явно назван метод, который вам вернуться.

1
ответ дан 28 июля 2011 в 01:07 Источник Поделиться

Просто разбить метод на более мелкие и переместить их все в отдельный класс, который будет использоваться только для создания путь к файлу. Он может быть строителем, как loki2302 сказал или просто поставщик

0
ответ дан 29 июля 2011 в 05:07 Источник Поделиться