How to get video duration from mp4, wmv, flv, mov videos

后端 未结 10 693
深忆病人
深忆病人 2020-11-30 07:51

Alright. Actually i need mostly the mp4 format. But if it is possible to get for other types as well that would be nice. I just need to read the duration of the file. How ca

10条回答
  •  萌比男神i
    2020-11-30 08:29

    This answer about P/Invoke for Shell32 reminded me of the Windows API Code Pack to access common Windows Vista/7/2008/2008R2 APIs.

    It was very easy, using the PropertyEdit demo in the included samples, to figure out the Shell32 API to get various media file properties, like duration.

    I assume the same prerequisite applies for having the proper demultiplexers installed, but it was quite simple, as it only required adding references to Microsoft.WindowsAPICodePack.dll and Microsoft.WindowsAPICodePack.Shell.dll and the following code:

    using Microsoft.WindowsAPICodePack.Shell;
    using Microsoft.WindowsAPICodePack.Shell.PropertySystem;
    
    using (ShellObject shell = ShellObject.FromParsingName(filePath))
    {
        // alternatively: shell.Properties.GetProperty("System.Media.Duration");
        IShellProperty prop = shell.Properties.System.Media.Duration; 
        // Duration will be formatted as 00:44:08
        string duration = prop.FormatForDisplay(PropertyDescriptionFormatOptions.None);
    }
    

    Other stuff

    Some common properties for an MPEG-4/AAC audio media file:

    System.Audio.Format = {00001610-0000-0010-8000-00AA00389B71}
    System.Media.Duration = 00:44:08
    System.Audio.EncodingBitrate = ?56kbps
    System.Audio.SampleRate = ?32 kHz
    System.Audio.SampleSize = ?16 bit
    System.Audio.ChannelCount = 2 (stereo)
    System.Audio.StreamNumber = 1
    System.DRM.IsProtected = No
    System.KindText = Music
    System.Kind = Music
    

    It's easy to iterate through all properties if you're looking for the available metadata:

    using (ShellPropertyCollection properties = new ShellPropertyCollection(filePath))
    {
        foreach (IShellProperty prop in properties)
        {
            string value = (prop.ValueAsObject == null) ? "" : prop.FormatForDisplay(PropertyDescriptionFormatOptions.None);
            Console.WriteLine("{0} = {1}", prop.CanonicalName, value);
        }
    }
    

提交回复
热议问题