C# Получают продолжительность видеофайла от метаданных

При поиске я получил следующий запрос, который делает задание с одним предположением (время выполнения запросов> 6 секунд)

<час>

ИЗБРАННОЕ имя пользователя, sql_text, sofar, totalwork, единицы

ОТ v$sql, v$session_longops

ГДЕ sql_address = адрес И sql_hash_value = адрес ORDER BY hash_value

, hash_value, child_number;

<час>

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

Комментарии приветствуются!!

24
задан Bill the Lizard 24 December 2009 в 15:31
поделиться

6 ответов

Взгляните на этот вопрос SO - Надежная оболочка FFmpeg для C # /. NET , которая связана с несколькими реализациями ffmpeg .Net. ffmpeg работает с большинством видеоформатов / кодеков. Таким образом, вам не нужно беспокоиться об установке кодека на машине.

Или посмотрите http://mediainfo.sourceforge.net/en .

8
ответ дан 29 November 2019 в 00:12
поделиться

Многие из этих деталей предоставляются оболочкой, поэтому вы можете сделать это, добавив ссылку на COM-библиотеку «Microsoft Shell Controls and Automation» (Shell32), а затем используя папку. GetDetailsOf для запроса расширенных сведений.

Недавно я искал это и наткнулся на этот самый вопрос на форумах MSDN C # General. Я закончил писать это как метод расширения для FileInfo:

    public static Dictionary<string, string> GetDetails(this FileInfo fi)
    {
        Dictionary<string, string> ret = new Dictionary<string, string>();
        Shell shl = new ShellClass();
        Folder folder = shl.NameSpace(fi.DirectoryName);
        FolderItem item = folder.ParseName(fi.Name);

        for (int i = 0; i < 150; i++)
        {
            string dtlDesc = folder.GetDetailsOf(null, i);
            string dtlVal = folder.GetDetailsOf(item, i);

            if (dtlVal == null || dtlVal == "")
                continue;

            ret.Add(dtlDesc, dtlVal);
        }
        return ret;
    }

Если вы ищете конкретные записи, вы можете сделать что-то подобное, хотя будет намного быстрее узнать, по какому индексу находятся эти записи (длина - index 27 Я верю) и просто запросите их. Обратите внимание: я не проводил большого исследования того, может ли индекс изменяться (я сомневаюсь в этом), поэтому я использовал словарный подход.

10
ответ дан 29 November 2019 в 00:12
поделиться

Я бы только что прокомментировал сообщение Микаэля, но у меня пока недостаточно репутации для этого. Я согласен с ним на использование ffmpeg, чтобы вам не требовалось устанавливать кодеки. Вы можете просто проанализировать вывод «ffmpeg -i your_filename», который просто выдаст некоторую информацию о видео, включая продолжительность.

Я не знаю, с какими кодеками вы работаете, но некоторые контейнеры фактически не хранят продолжительность в метаданных (это обычное явление для потоковых контейнеров, поскольку продолжительность неизвестна). Я не знаю, как ffmpeg справляется с этим, но, похоже, он каким-то образом находит это (возможно, путем анализа всего файла на наличие временных кодов).

3
ответ дан 29 November 2019 в 00:12
поделиться

MediaInfo - отличная библиотека с открытым исходным кодом для этой цели (DLL имеет лицензию LGPL). Пакет загрузки содержит пример приложения на C # (в разделе Developers \ Project \ MSCS \ Example )

0
ответ дан 29 November 2019 в 00:12
поделиться

У меня была такая же проблема с небольшим приложением для предварительного просмотра видео.

Проблема в управляемых помощниках отладки. Это проблема при использовании библиотек Managed DirectX 1.1 в VS2005 или 2008. Microsoft сконцентрировалась на MDX2, а затем на XNA, а не на Managed DirectX 1, поэтому не стоит слишком надеяться на исправление.

Простое решение - чтобы отключить обработку исключений LoaderLock во время отладки этого решения. В любом случае это не должно иметь никакого реального влияния на программу, поскольку эта ошибка появляется только в среде отладки.

Чтобы отключить, перейдите в Отладка -> Исключения -> Управляемые помощники отладки и снимите флажок LoaderLock.

Подробнее здесь: http://vivekthangaswamy.blogspot.com/2006/11/loaderlock-was-detected-error-when.html

0
ответ дан 29 November 2019 в 00:12
поделиться

используя DirectShowLib (http://directshownet.sourceforge.net/)

   /// <summary>
    /// Gets the length of the video.
    /// </summary>
    /// <param name="fileName">Name of the file.</param>
    /// <param name="length">The length.</param>
    /// <returns></returns>
    static public bool GetVideoLength(string fileName, out double length)
    {
        DirectShowLib.FilterGraph graphFilter = new DirectShowLib.FilterGraph();
        DirectShowLib.IGraphBuilder graphBuilder;
        DirectShowLib.IMediaPosition mediaPos;
        length = 0.0;

        try
        {
            graphBuilder = (DirectShowLib.IGraphBuilder)graphFilter;
            graphBuilder.RenderFile(fileName, null);
            mediaPos = (DirectShowLib.IMediaPosition)graphBuilder;
            mediaPos.get_Duration(out length);
            return true;
        }
        catch
        {
            return false;
        }
        finally
        {
            mediaPos = null;
            graphBuilder = null;
            graphFilter = null;
        }
    }
1
ответ дан 29 November 2019 в 00:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: