将 MediaInfo DLL 与 C# DLLImport 一起使用
Using MediaInfo DLL with C# DLLImport
使用 MediaInfo DLL(64 位),我试图获取提供有关 mp4 文件信息的标准文本输出。
为了包装 dll,根据我对 quickstart 指南的(有限)理解,我创建了一个 MediaInfo class。
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);
}
}
我使用下面的控制台应用程序调用此 class:
static void Main(string[] args)
{
var objMediaInfo = new MediaInfo();
objMediaInfo.Open("test.mp4");
string result = objMediaInfo.Inform();
objMediaInfo.Close();
Console.WriteLine(result);
Console.ReadKey();
}
但是,我在 return 中只得到一个空字符串。我尝试了几种不同的媒体文件。
我知道已经有一个完全开发的包装器,但我想保持它的简单和轻量级。
试试这个可能对你有用:
变化
[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_创建的指针(Handle)。您需要添加:
[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();
}
祝你好运。
编辑
抱歉回答不完整。我忘记在上一个 post 中包含您还需要通过 MediaInfo_Option [=] 设置 Inform 选项 API,这是定义返回数据的重要步骤:
[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");
objMediaInfo.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();
}
希望这次能成功。
namespace Test_MediaInfo{
public partial class MainWindow : Window
{
public class MediaInfo
{
[DllImport("MediaInfo.dll")]
private static extern IntPtr MediaInfo_New();
[System.Runtime.InteropServices.DllImport("MediaInfo.DLL")]
internal static extern IntPtr MediaInfo_Open(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string FileName);
[System.Runtime.InteropServices.DllImport("MediaInfo.DLL")]
private static extern IntPtr MediaInfo_Option(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string option, [MarshalAs(UnmanagedType.LPWStr)] string Value);
[System.Runtime.InteropServices.DllImport("MediaInfo.DLL")]
private static extern IntPtr MediaInfo_Inform(IntPtr Handle, UIntPtr Reserved);
[System.Runtime.InteropServices.DllImport("MediaInfo.DLL")]
private static extern void MediaInfo_Close(IntPtr Handle);
[System.Runtime.InteropServices.DllImport("MediaInfo.dll")]
private static extern void MediaInfo_Delete(IntPtr Handle);
[DllImport("MediaInfo.dll")]
private static extern IntPtr MediaInfoA_Option(IntPtr Handle, IntPtr Option, IntPtr Value);
IntPtr Handle;
public MediaInfo()
{
Handle = MediaInfo_New();
}
public System.IntPtr Open(string FileName)
{
return MediaInfo_Open(Handle, FileName);
}
public string Option(string option, string Value = "")
{
return Marshal.PtrToStringUni(MediaInfo_Option(Handle, option, Value));
}
public string Inform()
{
return Marshal.PtrToStringUni(MediaInfo_Inform(Handle, (UIntPtr)0));
}
public void Close()
{
MediaInfo_Close(Handle);
}
public void delete_pointeur()
{
MediaInfo_Delete(Handle);
}
}
//---------------------------------------------------------------------------------
public MainWindow()
{
InitializeComponent();
btn_go_Click(null, null);
}
//---------------------------------------------------------------------------------
private void btn_go_Click(object sender, RoutedEventArgs e)
{
string hhhh;
string FileName = "";
// FileName = @"F:\mkv\American Nightmare 2 - Anarchy (2014).mkv";
// FileName = @"F:\mp4\Cinq cartes à abattre (1968).mp4";
FileName = @"F:\avi\Danse avec les loups.avi";
string[] msg = new string[15];
var tmp = new MediaInfo();
tmp.Open(FileName);
tmp.Option("Inform", "General;%OverallBitRate/String%"); msg[0] = tmp.Inform();// 1 h 38 min
tmp.Option("Inform", "General;%Format%"); msg[1] = tmp.Inform();// MpEG-4
tmp.Option("Inform", "General;%FileSize/String3%"); msg[2] = tmp.Inform();// 3.67 GiB
tmp.Option("Inform", "General;%Duration/String2%"); msg[3] = tmp.Inform();// 1 h 38 min
tmp.Option("Inform", "Video;%Width% x %Height%"); msg[4] = tmp.Inform();// 1920 x 1080
tmp.Option("Inform", "Video;%DisplayAspectRatio/String%"); msg[5] = tmp.Inform();// 16.9
tmp.Option("Inform", "Video;%Format_Commercial%"); msg[6] = tmp.Inform();// AVC
tmp.Option("Inform", "General;%FrameRate/String%"); msg[7] = tmp.Inform();// 60.000 FPS
tmp.Option("Inform", "Video;%BitRate/String%"); msg[8] = tmp.Inform();// 5 165 kb/s
tmp.Option("Inform", "Video;%CodecID/Hint%"); msg[9] = tmp.Inform();// DivX 3 low
tmp.Option("Inform", "Audio;%SamplingRate/String%"); msg[10] = tmp.Inform();// 44.1 kHz
tmp.Option("Inform", "Audio;%Language/String%, %Channel(s)% channels, %Codec/String%, %SamplingRate/String%, %BitRate/String%"); msg[11] = tmp.Inform(); // ,2 channels,, 44.1kHz, 160 kb/s
tmp.Option("Inform", "Audio;%BitDepth/String%"); msg[12] = tmp.Inform();//
tmp.Option("Inform", "General;%Text_Language_List%"); msg[13] = tmp.Inform();// French / French / English
tmp.Option("Inform", "Video;%CodecID%"); msg[14] = tmp.Inform();// avc1
hhhh = tmp.Option("Complete", "1"); // end of session
tmp.Close();
tmp.delete_pointeur();
}
//---------------------------------------------------------------------------------
}
}
使用 MediaInfo DLL(64 位),我试图获取提供有关 mp4 文件信息的标准文本输出。
为了包装 dll,根据我对 quickstart 指南的(有限)理解,我创建了一个 MediaInfo class。
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);
}
}
我使用下面的控制台应用程序调用此 class:
static void Main(string[] args)
{
var objMediaInfo = new MediaInfo();
objMediaInfo.Open("test.mp4");
string result = objMediaInfo.Inform();
objMediaInfo.Close();
Console.WriteLine(result);
Console.ReadKey();
}
但是,我在 return 中只得到一个空字符串。我尝试了几种不同的媒体文件。
我知道已经有一个完全开发的包装器,但我想保持它的简单和轻量级。
试试这个可能对你有用:
变化
[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_创建的指针(Handle)。您需要添加:
[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();
}
祝你好运。
编辑
抱歉回答不完整。我忘记在上一个 post 中包含您还需要通过 MediaInfo_Option [=] 设置 Inform 选项 API,这是定义返回数据的重要步骤:
[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");
objMediaInfo.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();
}
希望这次能成功。
namespace Test_MediaInfo{
public partial class MainWindow : Window
{
public class MediaInfo
{
[DllImport("MediaInfo.dll")]
private static extern IntPtr MediaInfo_New();
[System.Runtime.InteropServices.DllImport("MediaInfo.DLL")]
internal static extern IntPtr MediaInfo_Open(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string FileName);
[System.Runtime.InteropServices.DllImport("MediaInfo.DLL")]
private static extern IntPtr MediaInfo_Option(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string option, [MarshalAs(UnmanagedType.LPWStr)] string Value);
[System.Runtime.InteropServices.DllImport("MediaInfo.DLL")]
private static extern IntPtr MediaInfo_Inform(IntPtr Handle, UIntPtr Reserved);
[System.Runtime.InteropServices.DllImport("MediaInfo.DLL")]
private static extern void MediaInfo_Close(IntPtr Handle);
[System.Runtime.InteropServices.DllImport("MediaInfo.dll")]
private static extern void MediaInfo_Delete(IntPtr Handle);
[DllImport("MediaInfo.dll")]
private static extern IntPtr MediaInfoA_Option(IntPtr Handle, IntPtr Option, IntPtr Value);
IntPtr Handle;
public MediaInfo()
{
Handle = MediaInfo_New();
}
public System.IntPtr Open(string FileName)
{
return MediaInfo_Open(Handle, FileName);
}
public string Option(string option, string Value = "")
{
return Marshal.PtrToStringUni(MediaInfo_Option(Handle, option, Value));
}
public string Inform()
{
return Marshal.PtrToStringUni(MediaInfo_Inform(Handle, (UIntPtr)0));
}
public void Close()
{
MediaInfo_Close(Handle);
}
public void delete_pointeur()
{
MediaInfo_Delete(Handle);
}
}
//---------------------------------------------------------------------------------
public MainWindow()
{
InitializeComponent();
btn_go_Click(null, null);
}
//---------------------------------------------------------------------------------
private void btn_go_Click(object sender, RoutedEventArgs e)
{
string hhhh;
string FileName = "";
// FileName = @"F:\mkv\American Nightmare 2 - Anarchy (2014).mkv";
// FileName = @"F:\mp4\Cinq cartes à abattre (1968).mp4";
FileName = @"F:\avi\Danse avec les loups.avi";
string[] msg = new string[15];
var tmp = new MediaInfo();
tmp.Open(FileName);
tmp.Option("Inform", "General;%OverallBitRate/String%"); msg[0] = tmp.Inform();// 1 h 38 min
tmp.Option("Inform", "General;%Format%"); msg[1] = tmp.Inform();// MpEG-4
tmp.Option("Inform", "General;%FileSize/String3%"); msg[2] = tmp.Inform();// 3.67 GiB
tmp.Option("Inform", "General;%Duration/String2%"); msg[3] = tmp.Inform();// 1 h 38 min
tmp.Option("Inform", "Video;%Width% x %Height%"); msg[4] = tmp.Inform();// 1920 x 1080
tmp.Option("Inform", "Video;%DisplayAspectRatio/String%"); msg[5] = tmp.Inform();// 16.9
tmp.Option("Inform", "Video;%Format_Commercial%"); msg[6] = tmp.Inform();// AVC
tmp.Option("Inform", "General;%FrameRate/String%"); msg[7] = tmp.Inform();// 60.000 FPS
tmp.Option("Inform", "Video;%BitRate/String%"); msg[8] = tmp.Inform();// 5 165 kb/s
tmp.Option("Inform", "Video;%CodecID/Hint%"); msg[9] = tmp.Inform();// DivX 3 low
tmp.Option("Inform", "Audio;%SamplingRate/String%"); msg[10] = tmp.Inform();// 44.1 kHz
tmp.Option("Inform", "Audio;%Language/String%, %Channel(s)% channels, %Codec/String%, %SamplingRate/String%, %BitRate/String%"); msg[11] = tmp.Inform(); // ,2 channels,, 44.1kHz, 160 kb/s
tmp.Option("Inform", "Audio;%BitDepth/String%"); msg[12] = tmp.Inform();//
tmp.Option("Inform", "General;%Text_Language_List%"); msg[13] = tmp.Inform();// French / French / English
tmp.Option("Inform", "Video;%CodecID%"); msg[14] = tmp.Inform();// avc1
hhhh = tmp.Option("Complete", "1"); // end of session
tmp.Close();
tmp.delete_pointeur();
}
//---------------------------------------------------------------------------------
}
}