我的IR项目里要对视频文件进行预览,目前还没有解决,以下的方法是一个尝试。
在system32下,有一个qedit.dll文件,这是DirectShow的一个COM组件(DS大部份都是COM组件),就是说我们可以直接以COM的形式引用到C#项目里。
我做了一个简单测试项目。先把qedit.dll找到,然后以COM注册到项目中。对MediaDet类进行了一个简单的封装,然后运行一个测试项目:
运行结果(从AVI中提取第10桢的内容):
部份代码:仅供参考:
MediaDetector类
using System;
using System.IO;
using DexterLib;
using System.Drawing;
using System.Drawing.Imaging;
namespace PublicLibrary
{
/**//// <summary>
/// Summary description for MediaDetector.
/// </summary>
public class MediaDetector
{
//fields
protected MediaDetClass _MediaDet;
protected Image.GetThumbnailImageAbort _ImageCallback;
//events
public event ErrorHandler OnError;
//properties
protected MediaDetClass MediaDecteor
{
get
{
if(this._MediaDet==null)
{
try
{
this._MediaDet = new MediaDetClass();
}
catch(Exception ex)
{
this.FileErrorEvent(ex);
}
}
return _MediaDet;
}
}
protected Image.GetThumbnailImageAbort ImageCallback
{
get
{
if(this._ImageCallback == null)
{
this._ImageCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
}
return this._ImageCallback;
}
}
//methods
private void FileErrorEvent(Exception i_ex)
{
if(this.OnError!=null)
{
try
{
this.OnError(this,i_ex);
}
catch(Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
}
}
}
/**//// <summary>
/// Method to get thumbinal image from media file.
/// </summary>
/// <param name="i_MediaFile">Media file full path and name.</param>
/// <param name="i_Size">Image size.</param>
/// <param name="i_type">Media type</param>
/// <param name="i_Stream">If the media type is video, this parameter is the video's stream to grab and create image.</param>
/// <returns></returns>
public Image GetThumbnail(string i_MediaFile,Size i_Size,MediaTypes i_type,int i_Stream)
{
switch(i_type)
{
default:
case MediaTypes.Unknow:
this.FileErrorEvent(new Exception("Unknow media type."));
return null;
case MediaTypes.Audio:
this.FileErrorEvent(new Exception("This media type has not implemented to create an image."));
return null;
case MediaTypes.Image:
return this.GetThumbnailFromImage(i_MediaFile,i_Size);
case MediaTypes.Video:
return this.GetThumbnailFromVideo(i_MediaFile,i_Size,i_Stream);
}
}
public Image GetThumbnailFromImage(string i_MediaFile,Size i_Size)
{
try
{
Image m_image = Image.FromFile(i_MediaFile);
return m_image.GetThumbnailImage(i_Size.Width,i_Size.Height,this.ImageCallback,IntPtr.Zero);
}
catch(Exception ex)
{
this.FileErrorEvent(ex);
return null;
}
}
public Image GetThumbnailFromVideo(string i_MediaFile,Size i_Size,int i_Stream)
{
this.MediaDecteor.Filename = i_MediaFile;
this.MediaDecteor.CurrentStream = 0;
//int m_ImageSize = (int)this.MediaDecteor.StreamLength;
try
{
this.MediaDecteor.WriteBitmapBits(i_Stream,i_Size.Width,i_Size.Height,"Temp.bmp");
Stream m_stream = File.Open("Temp.bmp",FileMode.Open,FileAccess.Read,FileShare.None);
byte[] m_bytes = new byte[m_stream.Length];
m_stream.Read(m_bytes,0,m_bytes.Length);
m_stream.Close();
File.Delete("Temp.bmp");
MemoryStream m_MemoStream = new MemoryStream(m_bytes.Length);
m_MemoStream.Write(m_bytes,0,m_bytes.Length);
return Image.FromStream(m_MemoStream);
}
catch(Exception ex)
{
this.FileErrorEvent(ex);
return null;
}
}
private bool ThumbnailCallback()
{
return false;
}
//ctor
public MediaDetector()
{
}
}
public class MediaHelper#region public class MediaHelper
public class MediaHelper
{
static public MediaTypes ConvertToMediaType(int i_Type)
{
switch(i_Type)
{
default:
case 0:
return MediaTypes.Unknow;
case 1:
return MediaTypes.Image;
case 2:
return MediaTypes.Video;
case 3:
return MediaTypes.Audio;
}
}
static public MediaTypes ConvertToMediaType(string i_Type)
{
switch(i_Type.ToLower())
{
default:
case "unknow":
return MediaTypes.Unknow;
case "image":
return MediaTypes.Image;
case "video":
return MediaTypes.Video;
case "audio":
return MediaTypes.Audio;
}
}
}
#endregion
public delegate void ErrorHandler(object i_Sender,Exception i_ex);
public enum MediaTypes
{
Image = 1,
Video = 2,
Audio = 3,
Unknow = 0,
}
}
using System;
using System.IO;
using DexterLib;
using System.Drawing;
using System.Drawing.Imaging;
namespace PublicLibrary
{
/**//// <summary>
/// Summary description for MediaDetector.
/// </summary>
public class MediaDetector
{
//fields
protected MediaDetClass _MediaDet;
protected Image.GetThumbnailImageAbort _ImageCallback;
//events
public event ErrorHandler OnError;
//properties
protected MediaDetClass MediaDecteor
{
get
{
if(this._MediaDet==null)
{
try
{
this._MediaDet = new MediaDetClass();
}
catch(Exception ex)
{
this.FileErrorEvent(ex);
}
}
return _MediaDet;
}
}
protected Image.GetThumbnailImageAbort ImageCallback
{
get
{
if(this._ImageCallback == null)
{
this._ImageCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
}
return this._ImageCallback;
}
}
//methods
private void FileErrorEvent(Exception i_ex)
{
if(this.OnError!=null)
{
try
{
this.OnError(this,i_ex);
}
catch(Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
}
}
}
/**//// <summary>
/// Method to get thumbinal image from media file.
/// </summary>
/// <param name="i_MediaFile">Media file full path and name.</param>
/// <param name="i_Size">Image size.</param>
/// <param name="i_type">Media type</param>
/// <param name="i_Stream">If the media type is video, this parameter is the video's stream to grab and create image.</param>
/// <returns></returns>
public Image GetThumbnail(string i_MediaFile,Size i_Size,MediaTypes i_type,int i_Stream)
{
switch(i_type)
{
default:
case MediaTypes.Unknow:
this.FileErrorEvent(new Exception("Unknow media type."));
return null;
case MediaTypes.Audio:
this.FileErrorEvent(new Exception("This media type has not implemented to create an image."));
return null;
case MediaTypes.Image:
return this.GetThumbnailFromImage(i_MediaFile,i_Size);
case MediaTypes.Video:
return this.GetThumbnailFromVideo(i_MediaFile,i_Size,i_Stream);
}
}
public Image GetThumbnailFromImage(string i_MediaFile,Size i_Size)
{
try
{
Image m_image = Image.FromFile(i_MediaFile);
return m_image.GetThumbnailImage(i_Size.Width,i_Size.Height,this.ImageCallback,IntPtr.Zero);
}
catch(Exception ex)
{
this.FileErrorEvent(ex);
return null;
}
}
public Image GetThumbnailFromVideo(string i_MediaFile,Size i_Size,int i_Stream)
{
this.MediaDecteor.Filename = i_MediaFile;
this.MediaDecteor.CurrentStream = 0;
//int m_ImageSize = (int)this.MediaDecteor.StreamLength;
try
{
this.MediaDecteor.WriteBitmapBits(i_Stream,i_Size.Width,i_Size.Height,"Temp.bmp");
Stream m_stream = File.Open("Temp.bmp",FileMode.Open,FileAccess.Read,FileShare.None);
byte[] m_bytes = new byte[m_stream.Length];
m_stream.Read(m_bytes,0,m_bytes.Length);
m_stream.Close();
File.Delete("Temp.bmp");
MemoryStream m_MemoStream = new MemoryStream(m_bytes.Length);
m_MemoStream.Write(m_bytes,0,m_bytes.Length);
return Image.FromStream(m_MemoStream);
}
catch(Exception ex)
{
this.FileErrorEvent(ex);
return null;
}
}
private bool ThumbnailCallback()
{
return false;
}
//ctor
public MediaDetector()
{
}
}
public class MediaHelper#region public class MediaHelper
public class MediaHelper
{
static public MediaTypes ConvertToMediaType(int i_Type)
{
switch(i_Type)
{
default:
case 0:
return MediaTypes.Unknow;
case 1:
return MediaTypes.Image;
case 2:
return MediaTypes.Video;
case 3:
return MediaTypes.Audio;
}
}
static public MediaTypes ConvertToMediaType(string i_Type)
{
switch(i_Type.ToLower())
{
default:
case "unknow":
return MediaTypes.Unknow;
case "image":
return MediaTypes.Image;
case "video":
return MediaTypes.Video;
case "audio":
return MediaTypes.Audio;
}
}
}
#endregion
public delegate void ErrorHandler(object i_Sender,Exception i_ex);
public enum MediaTypes
{
Image = 1,
Video = 2,
Audio = 3,
Unknow = 0,
}
}
测试Form代码:
Form类
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
//
using PublicLibrary;
namespace Country.Study
{
/**//// <summary>
/// Summary description for Thumbinal.
/// </summary>
public class Thumbnail : System.Windows.Forms.Form
{
private MediaDetector _MediaDetector;
//
private MediaDetector MediaDetector
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
//
using PublicLibrary;
namespace Country.Study
{
/**//// <summary>
/// Summary description for Thumbinal.
/// </summary>
public class Thumbnail : System.Windows.Forms.Form
{
private MediaDetector _MediaDetector;
//
private MediaDetector MediaDetector