Getting length of video

后端 未结 7 1970
忘掉有多难
忘掉有多难 2020-12-01 12:36

I am having trouble finding a simple example of how to get the video length of a file programmatically. Many people say, oh use this library/wrapper or whatever, but do not

相关标签:
7条回答
  • 2020-12-01 13:14

    you can get all sorts of information about many types of video formats including their duration with ffmpeg by using the -i flag:

    ffmpeg -i videofile.whatever
    

    If you want a nice library that can wrap ffmpef for you in C# then you can use MediaHandlerPro

    0 讨论(0)
  • 2020-12-01 13:14

    I recently found a solution to a similar problem I had, with ColdFusion and FFMpeg's little cousin, FFProbe...

    Is there a way to obtain the duration of a video file using ColdFusion?

    FFProbe has a show_streams argument that pushes out a considerable amount of information in the initial stream within the returned output; including the width, height and duration of a video...

    Not sure about C#'s syntax for running the equivalent of "ffprobe.exe -show_streams testFile" but I'm sure once you've figured that out, you can parse out the information you need from the output you receive.

    0 讨论(0)
  • 2020-12-01 13:25

    I have tried to get the video length in a bit different way :
    Actually using Windows Media Player Component also, we can get the duration of the video.
    Following code snippet may help you guys :

    using WMPLib;
    // ...
    var player = new WindowsMediaPlayer();
    var clip = player.newMedia(filePath);
    Console.WriteLine(TimeSpan.FromSeconds(clip.duration));
    

    and don't forget to add the reference of wmp.dll which will be present in System32 folder.

    0 讨论(0)
  • 2020-12-01 13:29

    Here is an example:

    using DirectShowLib;
    using DirectShowLib.DES;
    using System.Runtime.InteropServices;
    
    ...
    
    var mediaDet = (IMediaDet)new MediaDet();
    DsError.ThrowExceptionForHR(mediaDet.put_Filename(FileName));
    
    // find the video stream in the file
    int index;
    var type = Guid.Empty;
    for (index = 0; index < 1000 && type != MediaType.Video; index++)
    {
        mediaDet.put_CurrentStream(index);
        mediaDet.get_StreamType(out type);
    }
    
    // retrieve some measurements from the video
    double frameRate;
    mediaDet.get_FrameRate(out frameRate);
    
    var mediaType = new AMMediaType();
    mediaDet.get_StreamMediaType(mediaType);
    var videoInfo = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader));
    DsUtils.FreeAMMediaType(mediaType);
    var width = videoInfo.BmiHeader.Width;
    var height = videoInfo.BmiHeader.Height;
    
    double mediaLength;
    mediaDet.get_StreamLength(out mediaLength);
    var frameCount = (int)(frameRate * mediaLength);
    var duration = frameCount / frameRate;
    
    0 讨论(0)
  • 2020-12-01 13:36

    The easist and flawless solution I found is to use MediaToolkit nuget package.

    using MediaToolkit;
    
    // a method to get Width, Height, and Duration in Ticks for video.
    public static Tuple<int, int, long> GetVideoInfo(string fileName)
    {
        var inputFile = new MediaToolkit.Model.MediaFile { Filename = fileName };
        using (var engine = new Engine())
        {
            engine.GetMetadata(inputFile);
        }
    
        // FrameSize is returned as '1280x768' string.
        var size = inputFile.Metadata.VideoData.FrameSize.Split(new[] { 'x' }).Select(o => int.Parse(o)).ToArray();
    
        return new Tuple<int, int, long>(size[0], size[1], inputFile.Metadata.Duration.Ticks);
    }
    
    0 讨论(0)
  • 2020-12-01 13:37

    ffprobe is companian tool from the ffmpeg project. Besides provinding information from a wide range of file formats, it can also ouput in a JSON format to ease the parsing.

    Check this answer for an example of a JSON output.

    0 讨论(0)
提交回复
热议问题