С# Получить длительность видеофайла

Каким образом можно получить длительность видеофайла в Windows с помощью C#, не используя сторонние библиотеки (обертки ffmpeg и т.п.)? Существуют ли в C# какие-нибудь специальные функции для этого, или же можно использовать какие-либо внутренние API Windows?


Ответы (1 шт):

Автор решения: MSDN.WhiteKnight

или же можно использовать какие-либо внутренние API Windows?

Конечно можно, и даже нужно! Если Windows умеет воспроизводить какой-либо формат видео, то и получение длительности идет в комплекте. Проще всего добраться до него, не подключая библиотек и не декларируя никаких интерфейсов DirectShow / Media Foundation можно через свойства в Shell API. Media Foundation предоставляет провайдер со свойствами для видеофайлов, воспроизведение которых поддерживается, т.е. для тех, которые открываются в Windows Media Player. Именно благодаря этому в свойствах файла в проводнике можно посмотреть длительность, разрешение видео и др. Длительность является 27 свойством (что не документировано, но хорошо известно).

Вот так можно получить свойство через Shell API в C# (идея взята из этого ответа):

[STAThread]
static void Main(string[] args)
{
    string path = @"C:\Media\test.avi";
    string dir = Path.GetDirectoryName(path);
    string file = Path.GetFileName(path);

    Type shellAppType = Type.GetTypeFromProgID("Shell.Application");
    dynamic shell = Activator.CreateInstance(shellAppType);
    dynamic folder = shell.NameSpace(dir);
    dynamic folderItem = folder.ParseName(file);
    string value = folder.GetDetailsOf(folderItem, 27).ToString();

    Console.WriteLine("Duration: " + value);
}

Это выведет строку вида "Duration: 01:54:46"

Стандартно работает с форматами WMV и AVI. Провайдеры для других форматов могут быть добавлены с пакетами кодеков.

→ Ссылка