web-dev-qa-db-fra.com

Comment obtenir la durée de la vidéo à partir de vidéos mp4, wmv, flv, mov

Bien. En fait, j'ai surtout besoin du format MP4. Mais s'il est possible d'obtenir d'autres types également, ce serait bien. J'ai juste besoin de lire la durée du fichier. Comment puis-je faire cela avec C # 4.0?

Donc, la chose dont j'ai besoin est comme cette vidéo est comme: 13 minutes 12 seconds

Je peux utiliser 3 exes tiers aussi. Comme ils sauvegardent les informations sur le fichier dans un fichier texte. Je peux analyser ce fichier texte.

Je vous remercie.

19
MonsterMMORPG

Vous pouvez utiliser l'objet MediaDet de l'API DirectShow via la bibliothèque d'encapsuleur DirectShow.NET. Voir Obtenir la longueur de la vidéo pour un exemple de code, get_StreamLength vous donne la durée en secondes. Ceci suppose que le démultiplexeur MPEG-4 est installé sur Windows (requiert des composants tiers avec Windows avant 7, je pense que cela s'applique également à un autre réponse de cezor , il est cependant possible de redistribuer les composants).

11
Roman R.

Vous pouvez également utiliser Windows Media Player, bien qu'il ne prenne pas en charge tous les types de fichiers demandés.

using WMPLib;

public Double Duration(String file)
    {
        WindowsMediaPlayer wmp = new WindowsMediaPlayerClass();
        IWMPMedia mediainfo = wmp.newMedia(file);
        return mediainfo.duration;
    }
}
12
nickknissen

Cette réponse à propos de P/Invoke for Shell32 m'a rappelé le Windows API Code Pack pour accéder aux API Windows Vista/7/2008/2008R2 courantes.

Il était très facile, à l'aide de la démo PropertyEdit dans les exemples fournis, de déterminer l'API Shell32 pour obtenir diverses propriétés de fichier multimédia, telles que la durée.

Je suppose que les mêmes conditions préalables s’appliquent pour installer les démultiplexeurs appropriés, mais c’est assez simple, car il suffit d’ajouter des références à Microsoft.WindowsAPICodePack.dll et Microsoft.WindowsAPICodePack.Shell.dll et au code suivant:

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);
}

D'autres choses

Quelques propriétés communes pour un fichier multimédia audio MPEG-4/AAC:

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

Il est facile de parcourir toutes les propriétés si vous recherchez les métadonnées disponibles:

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);
    }
}
9
nekno

IMHO vous pouvez utiliser MediaInfo qui vous donne beaucoup d'informations sur les fichiers multimédias.
Il existe une CLI pour que vous puissiez l'utiliser à partir de votre code et obtenir les informations dont vous avez besoin.
Vous pouvez jeter un oeil sur ce lien .

5
Marco

Le projet FFMPEG comporte un outil, appelé ffprobe, qui peut vous fournir les informations dont vous avez besoin sur vos fichiers multimédia et les afficher dans un fichier JSON bien formaté.

Regardez cette réponse pour un exemple.

3
Paulo Fidalgo

Je pense que vous recherchez FFMPEG - http://www.ffmpeg-csharp.com/

il existe également des alternatives gratuites que vous pouvez lire à leur sujet dans cette question - Utilisation de FFmpeg dans .net?

   FFMpeg.NET
   FFMpeg-Sharp
   FFLib.NET

vous pouvez voir ce lien pour des exemples d'utilisation de FFMPEG et trouver la durée - 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]));
                }
            }
       }
3
Dor Cohen

En utilisant Windows Media Player Component également, nous pouvons obtenir la durée de la vidéo.
L'extrait de code suivant peut vous aider:

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

et n'oubliez pas d'ajouter la référence dewmp.dllqui sera présent dansSystem32dossier.

2
Rish

J'ai trouvé la bibliothèque NReco.VideoInfo comme étant la meilleure option et beaucoup plus simple que certaines des solutions ci-dessus. C'est aussi simple que de donner à la bibliothèque un chemin d'accès au fichier et de cracher les métadonnées:

var ffProbe = new FFProbe();
var videoInfo = ffProbe.GetMediaInfo(blob.Uri.AbsoluteUri);
return videoInfo.Duration.TotalMilliseconds;
1
James Mundy
StreamReader errorreader;
string InterviewID = txtToolsInterviewID.Text;

Process ffmpeg = new Process();

ffmpeg.StartInfo.UseShellExecute = false;
ffmpeg.StartInfo.ErrorDialog = false;
ffmpeg.StartInfo.RedirectStandardError = true;

ffmpeg.StartInfo.FileName = Server.MapPath("ffmpeg.exe");
ffmpeg.StartInfo.Arguments = "-i " + Server.MapPath("videos") + "\\226.flv";


ffmpeg.Start();

errorreader = ffmpeg.StandardError;

ffmpeg.WaitForExit();

string result = errorreader.ReadToEnd();

string duration = result.Substring(result.IndexOf("Duration: ") + ("Duration: ").Length, ("00:00:00.00").Length);
0
Koby Douek