С# Получить длительность видеофайла
Каким образом можно получить длительность видеофайла в Windows с помощью C#, не используя сторонние библиотеки (обертки ffmpeg и т.п.)? Существуют ли в C# какие-нибудь специальные функции для этого, или же можно использовать какие-либо внутренние API Windows?
Ответы (1 шт):
или же можно использовать какие-либо внутренние 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. Провайдеры для других форматов могут быть добавлены с пакетами кодеков.