Mediainfo DLL con Plugin Memory (Obtener inf de audio/video)

Ejemplos y plantillas para Autoplay Media Studio.
Hola buenas, os dejo aquí un pequeño ejemplo de como usar la DLL MediaIinfo que se usa para obtener una gran variedad de datos procedentes de archivos de Audio o Video. Yo la he usado para sacar datos de formatos de Audio tales como FLAC/APE/WV/MP3/MP4/M4A/WMA para un programa de conversión de música a AAC (m4A) y he conseguido sacar los TAGS e incluso las carátulas.

El código base lo saqué de un ejemplo de uso del plugin memory con la dll que encontré de casualidad para suerte mía, ya que antes usaba programas externos y aparte de ser mas engorroso a la hora de recuperar los datos tenía que usar bastantes más programas... El código se pega en "Global Functions" y puede que se pueda depurar pero no me he parado a ello :P

NOTA: Es necesario el plugin Memory para hacerla funcionar y la DLL que hace el trabajo que es el MediaInfo la cual podemos descargar gratuitamente desde la página oficial.

HIDE: ON
Hidebb Message Hidden Description


De donde tendremos que elejir la opción de 32Bits, DLL y Without Installer.
Imagen

Código (Global):
-----------------------------------------------------------------------------------------------------
----------------------------------------MEDIAINFO DLL-----------------------------------------------
-----------------------------------------------------------------------------------------------------
-- Kinds of Stream

Stream_General = 0
Stream_Video = 1
Stream_Audio = 2
Stream_Text = 3
Stream_Chapters = 4
Stream_Image = 5
Stream_Menu = 6
Stream_Max = 7


function MediaInfo_Init()
	Memory.OpenLibrary(60, "datos\\MediaInfo.dll")
	
	_MediaInfo_New = Memory.OpenFunction(60, "MediaInfoA_New", DLL_CALL_STDCALL, DLL_RETURN_LONG)
	_MediaInfo_Option = Memory.OpenFunction(60, "MediaInfoA_Option", DLL_CALL_STDCALL, DLL_RETURN_INT)
	_MediaInfo_Delete = Memory.OpenFunction(60, "MediaInfoA_Delete", DLL_CALL_STDCALL, DLL_RETURN_INT)
	_MediaInfo_Close = Memory.OpenFunction(60, "MediaInfoA_Close", DLL_CALL_STDCALL, DLL_RETURN_INT)
	_MediaInfo_Get = Memory.OpenFunction(60, "MediaInfoA_Get", DLL_CALL_STDCALL, DLL_RETURN_INT)
	
	_MediaInfo_Inform = Memory.OpenFunction(60, "MediaInfoA_Inform", DLL_CALL_STDCALL, DLL_RETURN_INT)
	_MediaInfo_Open = Memory.OpenFunction(60, "MediaInfoA_Open", DLL_CALL_STDCALL, DLL_RETURN_INT)
end


function MediaInfo_New()
	return Memory.CallFunction(_MediaInfo_New)
end

function MediaInfo_Option(Handle, Option, Value)
	if Value == nil then
		Value = ""
	end
	return Memory.GetString(Memory.CallFunction(_MediaInfo_Option, Handle, Option, Value), -1, "Ascii")
end

function MediaInfo_Delete(Handle)
	return Memory.CallFunction(_MediaInfo_Delete, Handle)
end

function MediaInfo_Close(Handle)
	return Memory.CallFunction(_MediaInfo_Close, Handle)
end

function MediaInfo_Get(Handle, StreamKind, StreamNumber, Parameter, InfoKind, SearchKind)
	if InfoKind == nil then
		InfoKind = Info_Text
	end
	if SearchKind == nil then
		SearchKind = Info_Name
	end
	return Memory.GetString(Memory.CallFunction(_MediaInfo_Get, Handle, StreamKind, StreamNumber, Parameter, InfoKind, SearchKind), -1, "Ascii")
end

function MediaInfo_Inform(Handle, reserved)
	if reserved == nil then
		reserved = 0
	end
	return Memory.GetString(Memory.CallFunction(_MediaInfo_Inform, Handle, reserved), -1, "Ascii")
end

function MediaInfo_Open(Handle, file)
	return Memory.CallFunction(_MediaInfo_Open, Handle, file)
end

function MediaInfo_Exit()
	Memory.CloseLibrary(60)
end

-----------------------------------------------------------------------------------------------------
----------------------------------------MEDIAINFO DLL END------------------------------------------
-----------------------------------------------------------------------------------------------------
Por supuesto hay que cambiar la ruta donde está la dll en Memory.OpenLibrary(60, "datos\\MediaInfo.dll") y no olvidaros de activar el plugin Memory.

Despues de poner eso en Funciones Globales tenemos que llamar a la función para lo que usaremos este código:
MediaInfo_Init()
hwnd = MediaInfo_New()
if MediaInfo_Open(hwnd, archivo) > 0 then
	MediaInfo_Option(hwnd, "Inform", "Video;%Height%")
	resultado = MediaInfo_Inform(hwnd);
	MediaInfo_Close(hwnd)
	MediaInfo_Delete(hwnd)
	MediaInfo_Exit()
end
Esto inicializa el plugin y carga en memoria la DLL, con el if comprobamos a la vez que abrimos el archivo si lo hace correctamente, donde archivo es la ruta del archivo del cual queremos sacar la información.
Despues del if nos encontramos con la opción MediaInfo_Option que usaremos para decirle a la DLL la información que queramos saber a través de "Video;%Height%" del cual vemos que hay dos opciones que son "Video" y "%Height%" de las cuales veremos las disponibles más adelante.
La siguiente línea guarda el resultado en la variable "resultado" y las tres siguientes se encargan de cerrar y eliminar la DLL de la memoria.

Dicho esto y sabiendo lo básico ya es hora de que veamos las opciones disponibles pero esto es demasiado extenso como para abordarlo en el post por lo que os diré como sacarlas directamente de los archivos que vienen junto con la DLL.
Una vez descomprimido veremos que hay una serie de archivos y carpetas junto con la DLL, entramos en "Developers\List_Of_Parameters" y ahí veremos una serie de archivos CSV los cual podremos abrirlos con el Excel por ejemplo, dentro de los cuales veremos las distintas opciones disponibles.

Para usarlo tomaremos el nombre del archivo sin la extensión ".csv" y ese será el primer parámetro (Video en el ejemplo), y abriendo el archivo veremos dentro un lista de las opciones las cuales tendremos que poner entre % (Height en el ejemplo):

Imagen

Despues solo apuntar que para hacer más fluido y rápido el script es mejor abrir el fichero una sola vez y despues poner las opciones seguidas como por ejemplo:
MediaInfo_Init()
hwnd = MediaInfo_New()
if MediaInfo_Open(hwnd, "C:\\video.avi") > 0 then
	MediaInfo_Option(hwnd, "Inform", "Video;%Height%")
	alt0 = MediaInfo_Inform(hwnd);

	MediaInfo_Option(hwnd, "Inform", "Video;%Width%")
	ancho = MediaInfo_Inform(hwnd);

	MediaInfo_Option(hwnd, "Inform", "Audio;%BitRate%")
	audiobitrate = MediaInfo_Inform(hwnd);

	MediaInfo_Close(hwnd)
	MediaInfo_Delete(hwnd)
	MediaInfo_Exit()
end
Espero que os sea de utilidad ;)
Gracias , bien se podría hacer un plugin de esto no?
Puede... yo es que soy muy novato para hacer algo de tal envergadura xD
muy bueno esto merece dedicarle un rapo rara travesear un poco.
luego le echare un ojo haber si tengo algo de tiempo tiene buena pinta.
Creo que ya no te paso el link :lol:

La verdad es que funciona muy bien, lo he usado como digo en un par de programas y quitando a veces que no me saca la carátula de las canciones (pocas) suele ir bastante bien, además de que acepta un montón de formatos sin necesidad de codecs ni nada parecido...
dani ayer me lo mire pero como no dices cuales son los valores posibles no puede hacer nada... ademas me petaba al intentar usarlo podrías colgar un ejemplo y decir cuales son los valores posibles...?
Los valores viene en los ficheros CSV de los que hablo en el primer post, son tantos que no podía ponerlos todos aquí y petar suele petar cuando no abre bien la DLL.

Ahora mismo estoy trabajando y no puedo ponerte un ejemplo después si eso te lo pongo. De todas formas estoy trabajando en un plugin de esto ;)

EDIT: Puedes ir echando un vistazo si quieres a este proyecto:

http://www.amsspecialist.info/viewtopic.php?f=12&t=252

Una parte utiliza la DLL MediaInfo para sacar los datos del vídeo.
si me dices que tas haciendo un plugin basado en esta dll ya me quedo mas tranquilo por que desde id3 que no ay ningún plugin decente de información de audio a mi me iría de PM si necesitas cualquier cosa me lo dices para eso estamos.

estoy impaciente por ver las posibilidades... ;)
Bueno, basado lo que es basado no del todo :lol: ya que no se programar, lo que estoy haciendo es incrustar la DLL en el plugin y que utilice las opciones disponibles en la DLL, es como un intermediario entre la DLL y el AMS, dando las opciones directamente...

pienso dejarlo para que funcione más menos así:
if MediaInfo.Open("C:\\video.avi") == true then
	resolucion = MediaInfo.Video("Resolution");
	MediaInfo.Close();
end
Lo único malo es que necesitará el plugin Memory para funcionar pero bueno...
a mientras me de todas las informaciones de los archivos de audio y me extraiga las caratulas en un formato medio digno ya me vale... esta de PM... ya me lo imagino... bueno ya me mostraras mas... un saludo!!!
Ya he colgado la primera beta del plugin aquí ;)

http://www.amsspecialist.info/viewtopic.php?f=15&t=258
genial!
voy a echarle un ojo..
thanks
gracias
Buenísimo!
gracias
tnks m8
THANKS