Search code examples
c#wmp

C# find the length of a video file


I am using the following code to find the length of a video file.

  WindowsMediaPlayer windowsMediaPlayer = new WindowsMediaPlayer();
  WindowsMediaPlayer player = windowsMediaPlayer;
  var clip = player.newMedia(strPath);
  WMPLength = $"{TimeSpan.FromSeconds(clip.duration)} ";
  player.close();

The code returns what I expect but there are two problems. One it crashes randomly. It crashes like its out of memory but while I do see memory usage go up it doesn't appear to be enough to crash the program Two it is very slow

Am I missing something in cleaning up the code, a memory leak or is there a better way to do this?

Thank you


Solution

  • First thing first: your method requires WMP installed on the computer, there are many editions without WMP installed oob.

    This is an approach i am using and no problems so far (not sure why you need the media player) is it a specific requirement, extension ?

    1-Install the following NuGet package, Microsoft.WindowsAPICodePack-Shell https://www.nuget.org/packages/Microsoft.WindowsAPICodePack-Shell

    2-Use the code snipet

    using Microsoft.WindowsAPICodePack.Shell;
    using Microsoft.WindowsAPICodePack.Shell.PropertySystem;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace VideoLenght
    {
        internal class Program
        {
            static void Main(string[] args)
            {
    
                Console.WriteLine(GetVideoDuration(@"C:\videos\20190531_005611.mp4"));
                Console.ReadLine();
    
    
            }
    
            public static TimeSpan GetVideoDuration(string filePath)
            {
                using (var shell = ShellObject.FromParsingName(filePath))
                {
                    IShellProperty prop = shell.Properties.System.Media.Duration;
                    var t = (ulong)prop.ValueAsObject;
                    return TimeSpan.FromTicks((long)t);
                }
    
            }
    
        }
    }