delphi - formato - reproductor de video online sin descargar
Obteniendo la duraciĆ³n del archivo AVI (1)
Estoy usando la unidad VFW de JEDI wrapper en WinAPI.
El código que estoy escribiendo busca buscar unidades de usuario y detectar warez (nota: decidir si algún archivo es legal o no va más allá del alcance de esta pregunta). Hacemos MP3, WMA y alguna búsqueda de archivos gráficos. Ahora queremos detectar películas ilegales. Quiero abrir el archivo AVI, leer algunos detalles y cerrarlo. Tengo el siguiente código:
uses WFV; //from JEDI api wrappers
procedure TForm1.Button1Click(Sender: TObject);
var
lInfo : TAVIFILEINFOW;
lFile : IAVIFILE;
lFileType : string;
lLenMinutes : integer;
lFPS : integer;
begin
{init file}
AVIFileInit;
try
{Open file - note: since we search for warez this is perfely "warezy" file}
AVIFileOpen(lFile, ''e:/Sideways KLAXXON/Sideways KLAXXON.avi'', OF_READ, nil);
try
{Get file info}
AVIFileInfoW(lFile, lInfo, sizeof(lInfo));
lFPS:=Round(lInfo.dwRate /lInfo.dwScale);
lLenMinutes := Round(lInfo.dwLength / lFPS / 60);
lFileType := lInfo.szFileType;
{just for show: prepare some memo to see what we get}
memo1.Lines.Clear;
memo1.Lines.Add(''File lenght [min]: '' + IntToStr(lLenMinutes));
memo1.Lines.Add(''Width: '' + IntToStr(lInfo.dwWidth));
memo1.Lines.Add(''Height: '' + IntToStr(lInfo.dwHeight));
memo1.Lines.Add(''File type: '' + lFileType);
finally
{Closing the file}
AVIFileRelease (lFile);
Pointer(lFile) := nil;
end;
finally
{Releasing library}
AVIFileExit;
end;
end;
Entonces lLenMinutes es algo equivalente a 98 mientras que la película dura aproximadamente 121 minutos. Esta es una gran diferencia. ¿Qué estoy haciendo mal? dwRate es 1 millón y dwScale es 40k, entonces el FPS es perfectamente 25. dwLength es 147k MSDN dice : "Las unidades están definidas por dwRate y dwScale".
Nota: este es un seguimiento de esta pregunta , pero como el problema se ha solucionado, cerré la otra pregunta y moví el contenido mejorado aquí.
MSDN dice que para el miembro AVIFILEINFO
de AVIFILEINFO
:
Cualquier secuencia puede definir su propia escala de tiempo para reemplazar la escala de tiempo del archivo.
¿Estás seguro de que las secuencias no anulan la velocidad y la escala proporcionadas en la estructura AVIFILEINFO
? la velocidad y la escala de una secuencia se almacenan en una estructura AVISTREAMINFO
.