PDA

Ver la Versión Completa : Como obtener metadatos de un archivo de video


JoAnCa
01-03-2020, 03:47:15
Hola a tod@s

Pues necesito saber como puedo obtener los metadatos de un archivo multimedia (de video o de audio), algunos de estos son los que aparecen en la pestaña "Detalles" de la ventana Propiedades cuando se hace clic derecho en un archivo multimedia.

En concreto los datos que me interesan son:
Video:
- Duración
- Ancho y Alto del fotograma (tamaño o resolucion)
- Velocidad de bits total (bitrate)
- Codificador de video

Audio:
- Velocidad de bits (bitrate)
- Canales
- Velocidad de muestreo
- Duracion (cuando es un archivo de audio)
- Codificador de audio

En el caso de un archivo de video, son todos los datos, de audio y de video.

ElKurgan
03-03-2020, 06:51:52
A lo mejor este enlace (https://chapmanworld.com/2018/03/14/media-file-meta-data-on-windows-in-delphi/)te da una pista: Habla sobre importar la librería de tipos del Windows Media Player y usar las funciones que exporta

Un saludo

JoAnCa
03-03-2020, 17:08:09
A lo mejor este enlace (https://chapmanworld.com/2018/03/14/media-file-meta-data-on-windows-in-delphi/)te da una pista: Habla sobre importar la librería de tipos del Windows Media Player y usar las funciones que exporta

Un saludo


Estuve probando con algo parecido a eso, pero para obtener los datos hay que abrir el video en el reproductor (y cerrarlo después)
Esto en un archivo no se nota tanto (si es corto), pero en una lista de 5, 10 o mas archivos de video demoraría un poco mas dependiendo de la longitud de los videos.



Lo que necesito es encontrar donde se guardan esos datos para leerlos sin necesidad de abrirlo en un reproductor, para que sea mas rapido

Casimiro Notevi
03-03-2020, 18:41:03
https://chapmanworld.com/2018/03/14/media-file-meta-data-on-windows-in-delphi/


Usando la biblioteca de tipos creada al importar el control del reproductor ActiveX, es posible interrogar cualquier video cargado en un reproductor de video. Esto no significa que el reproductor de video deba ser visible tampoco, puede crearse en tiempo de ejecución, interrogarse y desecharse sin tener que colocarlo en un formulario.

JoAnCa
03-03-2020, 22:37:22
https://chapmanworld.com/2018/03/14/media-file-meta-data-on-windows-in-delphi/


Cierto, dice que no tiene que estar visible, pero aun así lo abre en segundo plano toma los datos y después lo cierra, todo esto automáticamente.

Casimiro Notevi
04-03-2020, 09:16:16
Es que la otra opción que te queda es informarte sobre cómo es el "metadato"/cabecera de cada uno de los tipos de videos que te interesa y hacerlo tú mismo.

bucanero
04-03-2020, 10:29:26
En el comentario al enlace que te ha puesto ElKurgan se habla de la herramienta MediaInfo (https://sourceforge.net/projects/mediainfo/)precisamente para obtener este tipo de información, y en este enlace en particular se habla de hacerlo con delphi
https://sourceforge.net/p/mediainfo/discussion/297610/thread/a7260d2d/

No se si con esto puedas avanzar algo...

JoAnCa
05-03-2020, 21:08:35
Es que la otra opción que te queda es informarte sobre cómo es el "metadato"/cabecera de cada uno de los tipos de videos que te interesa y hacerlo tú mismo.

En este caso tendría que leer los bytes del archivo, algo que nunca he hecho :confused:

Según tengo entendido, tendría que usar TFileStream para leer los bytes del archivo (si me equivoco, rectificame).
Buscando en Google encontré las cabeceras de algunos archivos de video (en este caso un .AVI (http://www.fastgraph.com/help/avi_header_format.html)), pero no se como leer esos valores.

De que forma se haría?



En el comentario al enlace que te ha puesto ElKurgan se habla de la herramienta MediaInfo (https://sourceforge.net/projects/mediainfo/)precisamente para obtener este tipo de información, y en este enlace en particular se habla de hacerlo con delphi
https://sourceforge.net/p/mediainfo/...read/a7260d2d/ (https://sourceforge.net/p/mediainfo/discussion/297610/thread/a7260d2d/)

No se si con esto puedas avanzar algo...


Encontre dos posibles opciones: Tag Library (https://www.3delite.hu/Object%20Pascal%20Developer%20Resources/MP4TagLibrary.html) pero no me dan la opción para todos los formatos multimedia, y MedianInfo, que voy a experimentar con el para ver si se ajusta a mis necesidades.

JoAnCa
09-03-2020, 01:05:56
Pues finalmente resolvi el problema con la libreria MediaInfo ^\||/

MAXIUM
06-04-2020, 20:56:09
Pues finalmente resolvi el problema con la libreria MediaInfo ^\||/

Hola, ¿nos puedes decir como lo hicisteis o mejor, un código de ejemplo? Muchas gracias :D

JoAnCa
05-05-2020, 20:56:20
Hola, ¿nos puedes decir como lo hicisteis o mejor, un código de ejemplo? Muchas gracias :D

Disculpen, debí comentar como lo hice para que le pueda servir a otros

Pues yo cargo los archivos en un stringlist y de ahi los leo y le obtengo los metadatos con este codigo:

if (MediaInfoDLL_Load('MediaInfo.dll') = false) then
begin
MsgError('Error al cargar MediaInfo.dll', 'Error');
Exit;
end;
for i:=0 to ListaTagAcum.Count - 1 do
begin
Cad:=ListaTagAcum.Strings[i];
Ruta:=ExtractFilePath(Cad);
Archivo:=ExtractFileName(Cad);

Handle:=MediaInfo_New();
MediaInfo_Open(Handle,PWideChar(Ruta + Archivo)); //--- Abrir el archivo multimedia
sgListaMetaDatos.Cells[0, i+1]:=Archivo;
sgListaMetaDatos.Cells[1, i+1]:=MediaInfo_Get(Handle, Stream_General, 0, 'FileSize/String', Info_Text, Info_Name);
sgListaMetaDatos.Cells[2, i+1]:=MediaInfo_Get(Handle, Stream_General, 0, 'Duration/String2', Info_Text, Info_Name);
sgListaMetaDatos.Cells[3, i+1]:=MediaInfo_Get(Handle, Stream_General, 0, 'Format', Info_Text, Info_Name);
Resol:=MediaInfo_Get(Handle, Stream_Video, 0, 'Width', Info_Text, Info_Name) + 'x' + MediaInfo_Get(Handle, Stream_Video, 0, 'Height', Info_Text, Info_Name);
sgListaMetaDatos.Cells[4, i+1]:=Resol;
sgListaMetaDatos.Cells[5, i+1]:=MediaInfo_Get(Handle, Stream_General, 0, 'BitRate/String', Info_Text, Info_Name);
sgListaMetaDatos.Cells[6, i+1]:=MediaInfo_Get(Handle, Stream_Video, 0, 'Format', Info_Text, Info_Name);
sgListaMetaDatos.Cells[7, i+1]:=MediaInfo_Get(Handle, Stream_Audio, 0, 'BitRate/String', Info_Text, Info_Name);
sgListaMetaDatos.Cells[8, i+1]:=MediaInfo_Get(Handle, Stream_Audio, 0, 'SamplingRate', Info_Text, Info_Name);
sgListaMetaDatos.Cells[9, i+1]:=MediaInfo_Get(Handle, Stream_Audio, 0, 'Format', Info_Text, Info_Name);

pbProgress.Progress:=i;
pbProgress.Repaint;
Application.ProcessMessages;
end;