2008-09-30 9 views
26

Ich bin auf der Suche nach einer Funktion, die ein einzelnes Bild aus einem Video empfängt, so dass ich es als Miniatur verwenden kann.Wie bekomme ich ein Video-Thumbnail in .Net?

Etwas in dieser Richtung sollte funktionieren:

// filename examples: "test.avi", "test.dvr-ms" 
// position is from 0 to 100 percent (0.0 to 1.0) 
// returns a bitmap 
byte[] GetVideoThumbnail(string filename, float position) 
{ 
} 

Wer weiß, wie das 3.0 in .Net zu tun?

Die richtige Lösung wird die "beste" Implementierung dieser Funktion sein. Bonuspunkte zur Vermeidung der Auswahl leerer Rahmen.

+0

jeden vollen sauer CE-Codebeispiel? – Kiquenet

Antwort

10

Ich beendete meine eigene Stand-Alone-Klasse rollen (mit der einzigen Methode, die ich beschrieben habe), die Quelle kann viewed here sein. Media browser is GPL, aber ich freue mich für den Code, den ich für diese Datei Public Domain geschrieben habe. Denken Sie daran, es verwendet Interop aus dem Projekt directshow.net, so dass Sie diesen Teil des Codes mit ihnen löschen müssen.

Diese Klasse funktioniert nicht für DVR-MS-Dateien, Sie müssen einen direkten Show-Filter für diese einspeisen.

+0

Hallo - das ist wirklich nützlich, aber ich bekomme einige Probleme ohne tatsächliche Fehler. Für WMV-Dateien (die nicht unterstützt werden) bekomme ich einen Outputstream vom Aufruf IMediaDet.get_OutputStreams() - aber das IMediaDet.WriteBitmapBits() macht dann nichts. Bei AVI-Dateien gibt der Aufruf von IMediaDet.get_OutputStreams() jedoch nichts zurück und die Methode kehrt einfach zurück, ohne etwas zu tun. Ich habe Basics Datei I/O Probleme und Berechtigungen etc ausgeschlossen (die gleiche App lädt das Video, und wie erwähnt, erhalten Sie auch den Outputstream für bestimmte Formate). Alle Hinweise/Vorschläge, die Sie haben könnten, wären großartig! – user369142

+0

persönlich würde ich jetzt auf ffdshow aussehen, die ms direkten show-schnittstellen sind so shakey –

+1

@SamSaffron Irgendwelche Empfehlungen dazu, dies im Jahr 2015? Ich kann die MediaBrowser-Bibliothek nicht auf nugget finden, sodass ich Ihren Gist nicht testen kann. –

0

Es gibt einige Bibliotheken www.mitov.com, die helfen können. Es ist ein allgemeiner Wrapper für die DirectShow-Funktionalität, und ich denke, einer der Demos zeigt, wie man einen Frame aus einer Videodatei nimmt.

2

1- Get neueste Version von ffmpeg.exe aus: http://ffmpeg.arrozcru.org/builds/

2- Entpacken Sie die Datei und kopieren ffmpeg.exe auf Ihre Website

3- Mit diesem Code:

Process ffmpeg; 

string video; 
string thumb; 

video = Server.MapPath("first.avi"); 
thumb = Server.MapPath("frame.jpg"); 

ffmpeg = new Process(); 

ffmpeg.StartInfo.Arguments = " -i "+video+" -ss 00:00:07 -vframes 1 -f image2 -vcodec mjpeg "+thumb; 
ffmpeg.StartInfo.FileName = Server.MapPath("ffmpeg.exe"); 
ffmpeg.Start(); 
+0

Einfacher zu verwenden in cmd: ffmpeg.exe -i "Dateiname.mp4" -ss 00:00:02 -vframes 1 -f image2 -vcodec mjpeg frame.jpg –