it-swarm.com.de

So erhalten Sie die Videodauer von mp4-, wmv-, flv- und mov-Videos

In Ordung. Eigentlich brauche ich meistens das mp4-Format. Aber wenn es möglich ist, auch für andere Typen zu bekommen, wäre das schön. Ich muss nur die Dauer der Datei lesen. Wie kann ich das mit C # 4.0 machen?

Was ich brauche, ist wie dieses Video: 13 minutes 12 seconds

Ich kann auch 3 Drittanbieter-Exes verwenden. Als würden sie die Informationen über die Datei in eine Textdatei speichern. Ich kann diese Textdatei parsen.

Vielen Dank.

19
MonsterMMORPG

Sie können das DirectShow-API-Objekt MediaDet über die DirectShow.NET-Wrapper-Bibliothek verwenden. Siehe Abrufen der Videolänge für Codebeispiel, get_StreamLength liefert die Dauer in Sekunden. Dies setzt voraus, dass Windows einen Demultiplexer MPEG-4 installiert hat (erfordert Komponenten von Drittanbietern mit Windows vor 7, ich glaube, dasselbe gilt für eine andere answer von cezor , Komponenten können jedoch frei verteilt werden).

11
Roman R.

Sie können auch Windows Media Player verwenden, obwohl er nicht alle angeforderten Dateitypen unterstützt

using WMPLib;

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

Diese Antwort über P/Invoke für Shell32 erinnerte mich an das Windows API Code Pack , um auf allgemeine Windows Vista/7/2008/2008R2-APIs zuzugreifen.

Es war sehr einfach, mithilfe der PropertyEdit-Demo in den mitgelieferten Beispielen die Shell32-API zu ermitteln, um verschiedene Mediendateieigenschaften wie die Dauer abzurufen.

Ich gehe davon aus, dass dieselbe Voraussetzung für die Installation der richtigen Demultiplexer gilt, aber es war ziemlich einfach, da lediglich Verweise auf Microsoft.WindowsAPICodePack.dll und Microsoft.WindowsAPICodePack.Shell.dll und der folgende Code hinzugefügt werden mussten:

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

Andere Sachen

Einige allgemeine Eigenschaften für eine MPEG-4/AAC-Audio-Mediendatei:

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

Es ist leicht, alle Eigenschaften zu durchlaufen, wenn Sie nach verfügbaren Metadaten suchen:

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 könnten Sie MediaInfo verwenden, wodurch Sie viele Informationen zu Mediendateien erhalten.
Es gibt eine CLI, damit Sie sie aus Ihrem Code heraus verwenden können und Informationen erhalten, die Sie benötigen.
Sie können einen Blick auf diesen Link werfen.

5
Marco

Das FFMPEG-Projekt verfügt über ein Werkzeug namens ffprobe, mit dem Sie die benötigten Informationen zu Ihren Multimedia-Dateien erhalten und die Informationen in einem formschönen JSON-Format ausgeben können.

Betrachten Sie diese Antwort als Beispiel.

3
Paulo Fidalgo

Ich denke, Sie suchen nach FFMPEG - http://www.ffmpeg-csharp.com/

es gibt auch einige kostenlose Alternativen, die Sie in dieser Frage nachlesen können - Verwenden von FFmpeg in .net?

   FFMpeg.NET
   FFMpeg-Sharp
   FFLib.NET

dieser Link zeigt Beispiele für die Verwendung von FFMPEG und die Ermittlung der Dauer - 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

Mit der Windows Media Player-Komponente können wir auch die Dauer des Videos ermitteln.
Der folgende Code-Ausschnitt kann Ihnen helfen:

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

und vergessen Sie nicht, die Referenz vonwmp.dllhinzuzufügen, die .__ ist. inSystem32ordner vorhanden.

2
Rish

Ich fand die Bibliothek NReco.VideoInfo als die beste Option und weitaus einfacher als einige der obigen. Es ist einfach, der Bibliothek einen Dateipfad zu geben und die Metadaten auszuspucken:

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

Ich hatte das gleiche Problem und wir bauten einen Wrapper für ffprobe Alturos.VideoInfo . Sie können es einfach verwenden, indem Sie das nuget -Paket installieren. Außerdem wird die Binärdatei ffprobe benötigt.

PM> install-package Alturos.VideoInfo

Beispiel

var videoFilePath = "myVideo.mp4";

var videoAnalyer = new VideoAnalyzer("ffprobe.exe");
var analyzeResult = videoAnalyer.GetVideoInfo(videoFilePath);

var duration = analyzeResult.VideoInfo.Format.Duration;
0
Tino Hager
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