使用MediaInfo DLL(64位),我试图获取提供有关mp4文件信息的标准文本输出。
为了包装dll,我根据quickstart指南的(有限的)理解,创建了一个MediaInfo类。
public class MediaInfo
{
[DllImport("MediaInfo.dll")]
private static extern IntPtr MediaInfo_New();
[DllImport("MediaInfo.dll")]
private static extern void MediaInfo_Open(string FileName);
[DllImport("MediaInfo.dll")]
private static extern IntPtr MediaInfo_Inform(IntPtr Handle);
[DllImport("MediaInfo.DLL")]
private static extern void MediaInfo_Close(IntPtr Handle);
IntPtr Handle;
public MediaInfo()
{
Handle = MediaInfo_New();
}
public void Open(string FileName)
{
MediaInfo_Open(FileName);
}
public string Inform()
{
return Marshal.PtrToStringUni(MediaInfo_Inform(Handle));
}
public void Close()
{
MediaInfo_Close(Handle);
}
}
而且我正在使用以下控制台应用程序调用此类:
static void Main(string[] args)
{
var objMediaInfo = new MediaInfo();
objMediaInfo.Open("test.mp4");
string result = objMediaInfo.Inform();
objMediaInfo.Close();
Console.WriteLine(result);
Console.ReadKey();
}
但是,我只得到一个空白字符串作为回报。我尝试了一些不同的媒体文件。
我知道已经有一个完善的包装器,但是我想保持这种简单和轻巧。
尝试此操作可能对您有用:
更改
[System.Runtime.InteropServices.DllImport("MediaInfo.DLL")]
private static extern UIntPtr MediaInfo_Open(IntPtr Handle, string FileName);
[System.Runtime.InteropServices.DllImport("MediaInfo.DLL")]
private static extern IntPtr MediaInfo_Inform(IntPtr Handle, UIntPtr Reserved);
public System.UIntPtr Open(string FileName)
{
return MediaInfo_Open(Handle, FileName);
}
public string Inform()
{
return Marshal.PtrToStringUni(MediaInfo_Inform(Handle, (UIntPtr)0));
}
清理
不要忘记删除_MediaInfo_New_创建的指针(句柄)。您需要添加:
[DllImport("MediaInfo.dll")]
private static extern void MediaInfo_Delete(IntPtr Handle);
因此:
~MediaInfo() { if (Handle == (IntPtr)0) return; MediaInfo_Delete(Handle); }
实施
然后在您的实现中,您必须传递媒体文件的完整路径,而不仅仅是其名称:
static void Main(string[] args)
{
var objMediaInfo = new MediaInfo();
objMediaInfo.Open(@"TheFullPathOf\test.mp4");
string result = objMediaInfo.Inform();
objMediaInfo.Close();
Console.WriteLine(result);
Console.ReadKey();
}
祝你好运。>>
编辑
对不起,答案不完整。我忘了在上一篇文章中提到您还需要通过MediaInfo_Option
API设置Inform选项,这是定义返回数据的重要步骤:[System.Runtime.InteropServices.DllImport("MediaInfo.DLL")] private static extern IntPtr MediaInfo_Option(IntPtr Handle, string option, string Value);
为此创建函数:
public string Option(string option, string Value = "") { return Marshal.PtrToStringUni(MediaInfo_Option(Handle, option, Value)); }
最后,修改您的实现:
static void Main(string[] args) { var objMediaInfo = new MediaInfo(); objMediaInfo.Open(@"TheFullPathOf\test.mp4"); mi.Option("Complete"); //or mi.Option("Complete", "1") or mi.Option("Info_Parameters") try them.. string result = objMediaInfo.Inform(); objMediaInfo.Close(); Console.WriteLine(result); Console.ReadKey(); }
希望这次能够正常工作。