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.
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).
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;
}
}
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);
}
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);
}
}
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.
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]));
}
}
}
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 de
wmp.dll
qui sera présent dansSystem32
dossier.
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;
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);