2016-05-10 12 views
0

Ich lese von einem Ordner die MP4-Dateien dort Zur Zeit verwende ich FileInfo, um den Namen zu extrahieren FileInfo ist auf ein paar der Details eines Films beschränkt. Ich brauche auch andere Informationen wie Titel Untertitel Kommentare Genre Directors ProducersZugriff auf Videodatei-Informationen in C#

DirectoryInfo dirInfo = new DirectoryInfo(@"..\bin\Debug\Folder"); 
FileInfo[] fileNames = dirInfo.GetFiles("*.mp4"); 
foreach (FileInfo fi in fileNames) 
{ 
    string movieName = fi.Name.Split('.')[0]; // returns the file name 
    VideoFile newVideo = new VideoFile(movieName); // insert name in object 
      director.ListVid.Add(newVideo); // add object to a director object - aka another list 
} 
listVideoDirector.Add(director); //add director object to list 

Mein videofile Objekt hat mehrere Attribute zu extrahieren. Ich muss sie aus der eigentlichen Datei extrahieren

+0

Siehe Eintrag: http://stackoverflow.com/questions/58649/how-to -get-the-exif-Daten aus einer Datei-mit-c-sharp – jdweng

+0

Hmm ... Ich sollte die Frage eingrenzen. Es gibt eine Shell-Erweiterung. Es enthält Dinge wie System.Media.SubTitle. Aber ich kann sie nicht finden –

+0

Ein Bild enthält möglicherweise nicht alle exif Daten. Es hängt von der Anwendung (und der Person) ab, welche Erweiterungen in das Bild geschrieben werden. Zum Beispiel würde eine Kamera die Anzahl von Pixeln automatisch und einen automatischen Zahlentitel eingeben (den eine Person manuell ändern kann, um das Bild zu beschreiben), aber nicht immer einen Untertitel. – jdweng

Antwort

1

Sie können ffmpeg (ffmpeg.exe oder ffprobe.exe) zum Extrahieren von Metadaten aus Video- oder Audiodateien verwenden (unterstützt fast alle bekannten Formate). FFMpeg kann mit System.Diagnostics aus C# -Code ausgeführt werden. Prozess- und Videodateimetadaten sollten von der Konsolenausgabe aus analysiert werden (Sie können stdout umleiten und als String lesen).

Als Alternative zum Schreiben von benutzerdefinierten Code, der ffprobe ausführt, können Sie einen der vorhandenen .NET-Wrapper verwenden, die ein Ergebnis mit einer Codezeile zurückgeben (wie NReco VideoInfo - ich bin ein Autor dieser Bibliothek).

+0

Ich habe es versucht, aber gescheitert :) Ich habe die NRECO in meinen Referenzen. –

+0

var ffProbe = new FFProbe(); var videoInfo = ffProbe.GetMediaInfo (fi.FullName); Zeichenfolge info1 = null; Zeichenfolge info2 = null; foreach (var-Tag in videoInfo.FormatTags) { info1 = tag.Key; info2 = tag.Wert; } // Zeichenfolge info4 = info1.Split ('') [0]; // Genre Zeichenkette genre = info2.Split ('') [0]; –

+0

Uhm, das klingt nicht gut. Die Sache ist die Art, wie ich versuche, die Informationen falsch zu machen, denke ich. Wenn ich split [0] sage, gibt es nur das Genre zurück, wenn ich split [1] sage. Ich erhalte eine Null-Referenz-Ausnahme –

3

Ich habe die Bibliothek FFProbe verwendet

Download-Library: https://www.nrecosite.com/downloads/video_info_free.zip

zum Beispiel:

string path = "Video path"; 
NReco.VideoInfo.FFProbe ffProbe = new NReco.VideoInfo.FFProbe(); 
MediaInfo videoInfo = ffProbe.GetMediaInfo(path); 

TimeSpan videoDuration = videoInfo.Duration; 

if (videoInfo.Streams[index].CodecType.ToLower() == "video") 
{ 
int iWidth = videoInfo.Streams[index].Width; 
int iHeight = videoInfo.Streams[index].Height; 
string sVideoFrameRate = videoInfo.Streams[index].FrameRate.ToString(); 
string sVideoCodecName = videoInfo.Streams[index].VideoCodecName; 
    //... 
} 
else if(videoInfo.Streams[index].CodecType.ToLower() == "audio") 
{ 
    string sAudioCodecName = videoInfo.Streams[index].CodecName; 
    //... 
}