Использование MediaInfo DLL с C # DLLImport - PullRequest
1 голос
/ 23 октября 2019

Используя MediaInfo DLL (64-разрядная версия), я пытаюсь получить стандартный текстовый вывод с информацией о файле mp4.

Чтобы обернуть dll, я создал MediaInfoкласс, основанный на моем (ограниченном) понимании из руководства quickstart .

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();
    }

Тем не менее, я получаю только пустую строку взамен. Я пробовал несколько разных медиа-файлов.

Я знаю, что для этого уже есть полностью разработанная оболочка, но я хотел бы сохранить эту простоту и легкость.

1 Ответ

2 голосов
/ 23 октября 2019

Попробуйте, это может работать для вас:

Изменения

[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();
}

Удачи.

Редактировать

Извините за неполный ответ. Я забыл указать в своем последнем сообщении, что вам также нужно установить параметр Inform через API MediaInfo_Option , это важный шаг для определения возвращаемых данных:

[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();
}

Надеюсь, на этот раз это сработает.

enter image description here

...