Come ottenere la durata del video da mp4, wmv, flv, video mov

Tutto apposto. In realtà ho bisogno principalmente del formato mp4. Ma se è ansible ottenere per altri tipi, sarebbe bello. Ho solo bisogno di leggere la durata del file. Come posso farlo con C # 4.0?

Quindi la cosa di cui ho bisogno è come questo video: 13 minutes 12 seconds

Posso usare anche 3 terze parti. Come se salvassero le informazioni sul file in un file di testo. Posso analizzare quel file di testo.

Grazie.

È ansible utilizzare l’object MediaDet dell’API DirectShow tramite la libreria di wrapper DirectShow.NET. Vedi Ottenere la lunghezza del video per l’esempio di codice, get_StreamLength ti ottiene la durata in secondi. Ciò presuppone che Windows abbia installato il demultiplexer MPEG-4 (richiede componenti di terze parti con Windows precedenti a 7, credo che lo stesso valga per un’altra risposta di cezor , tuttavia è ansible ridistribuire i componenti).

È anche ansible utilizzare Windows Media Player, sebbene non supporti i tipi di file richiesti

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

Questa risposta a proposito di P / Invoke per Shell32 mi ha ricordato il pacchetto di codice API di Windows per accedere alle comuni API di Windows Vista / 7/2008 / 2008R2.

È stato molto semplice, usando la demo di PropertyEdit negli esempi inclusi, per capire l’API Shell32 per ottenere varie proprietà dei file multimediali, come la durata.

Presumo che lo stesso prerequisito valga per avere installati i demultiplexer appropriati, ma era piuttosto semplice, in quanto richiedeva solo l’aggiunta di riferimenti a Microsoft.WindowsAPICodePack.dll e Microsoft.WindowsAPICodePack.Shell.dll e il seguente codice:

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

Altre cose

Alcune proprietà comuni per un file multimediale 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 

È facile scorrere tutte le proprietà se stai cercando i metadati disponibili:

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

IMHO potresti usare MediaInfo che ti dà molte informazioni sui file multimediali.
C’è una CLI per poterla usare dal tuo codice e ottenere informazioni di cui hai bisogno.
Puoi dare un’occhiata a questo link .

Penso che stiate cercando FFMPEG – http://www.ffmpeg-csharp.com/

ci sono anche alcune alternative gratuite che puoi leggere su di esse in questa domanda – Usando FFmpeg in .net?

  FFMpeg.NET FFMpeg-Sharp FFLib.NET 

puoi vedere questo link per esempi di utilizzo di FFMPEG e trovare la durata – 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])); } } } 

Il progetto FFMPEG ha uno strumento, chiamato ffprobe, che può fornirti le informazioni necessarie sui tuoi file multimediali e pubblicare le informazioni in un JSON ben strutturato.

Dai un’occhiata a questa risposta per un esempio.

Ho trovato la libreria NReco.VideoInfo come l’opzione migliore e molto più semplice di alcune di quelle sopra. È semplice come dare alla libreria un percorso file e sputa i metadati:

 var ffProbe = new FFProbe(); var videoInfo = ffProbe.GetMediaInfo(blob.Uri.AbsoluteUri); return videoInfo.Duration.TotalMilliseconds; 

Usando anche il componente Windows Media Player, possiamo ottenere la durata del video.
Il seguente snippet di codice potrebbe aiutarti a:

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

e non dimenticare di aggiungere il riferimento di wmp.dll che sarà presente nella cartella System32 .

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