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

后端 未结 10 665
深忆病人
深忆病人 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条回答
  • 2020-11-30 08:17

    You could also use windows media player, although it don't support alle file types you requested

    using WMPLib;
    
    public Double Duration(String file)
        {
            WindowsMediaPlayer wmp = new WindowsMediaPlayerClass();
            IWMPMedia mediainfo = wmp.newMedia(file);
            return mediainfo.duration;
        }
    }
    
    0 讨论(0)
  • 2020-11-30 08:18

    I found the NReco.VideoInfo library to be the best option and far simpler than some of those above. It's a simple as giving the library a file path and it spits out the metadata:

    var ffProbe = new FFProbe();
    var videoInfo = ffProbe.GetMediaInfo(blob.Uri.AbsoluteUri);
    return videoInfo.Duration.TotalMilliseconds;
    
    0 讨论(0)
  • 2020-11-30 08:23

    I think you are looking for FFMPEG - https://ffmpeg.org/

    there are also some free alternatives that you can read about them in this question - Using FFmpeg in .net?

       FFMpeg.NET
       FFMpeg-Sharp
       FFLib.NET
    

    you can see this link for examples of using FFMPEG and finding the duration - http://jasonjano.wordpress.com/2010/02/09/a-simple-c-wrapper-for-ffmpeg/

            public VideoFile GetVideoInfo(string inputPath)
            {
                VideoFile vf = null;
                try
                {
                    vf = new VideoFile(inputPath);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                GetVideoInfo(vf);
                return vf;
            }
            public void GetVideoInfo(VideoFile input)
            {
                //set up the parameters for video info
                string Params = string.Format("-i {0}", input.Path);
                string output = RunProcess(Params);
                input.RawInfo = output;
    
                //get duration
                Regex re = new Regex("[D|d]uration:.((\\d|:|\\.)*)");
                Match m = re.Match(input.RawInfo);
    
                if (m.Success)
                {
                    string duration = m.Groups[1].Value;
                    string[] timepieces = duration.Split(new char[] { ':', '.' });
                    if (timepieces.Length == 4)
                    {
                        input.Duration = new TimeSpan(0, Convert.ToInt16(timepieces[0]), Convert.ToInt16(timepieces[1]), Convert.ToInt16(timepieces[2]), Convert.ToInt16(timepieces[3]));
                    }
                }
           }
    
    0 讨论(0)
  • 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);
        }
    }
    
    0 讨论(0)
提交回复
热议问题