Hola amigos
Como puedo hacer para mostrar el tiempo de duracion de un archivo de video, como lo muestra el explorer de windows
He intentado con Directory y con el comando DIR y no muestra.
Gracias por la ayuda
Saludos,
Adhemar
Adhemar C.
Hola amigos
Como puedo hacer para mostrar el tiempo de duracion de un archivo de video, como lo muestra el explorer de windows
He intentado con Directory y con el comando DIR y no muestra.
Gracias por la ayuda
Saludos,
Adhemar
/*------------------------------------------------------------------------------*/
*STATIC Function GetPropFile( oWnd, cFile )
/*------------------------------------------------------------------------------*/
/*
LOCAL oActiveX, pStatus := Array( 11 )
oActiveX = TActiveX():New( oWnd, "MediaPlayer.MediaPlayer.1",0,0,0,0)
oActiveX:SetProp( "FileName", cFile )
oActiveX:Hide()
pStatus[1] := cFileNoPath( oActiveX:GetProp( "FileName" ) ) // Nombre del fichero
pStatus[2] := cFilePath( oActiveX:GetProp( "FileName" ) ) // Path
pStatus[3] := oActiveX:GetProp( "Duration" ) // Duracion
pStatus[4] := oActiveX:GetProp( "ImageSourceWidth" ) // Ancho fotograma
pStatus[5] := oActiveX:GetProp( "ImageSourceHeight" ) // Alto fotograma
pStatus[6] := oActiveX:GetProp( "BandWidth" ) // Velocidad de datos
pStatus[7] := oActiveX:GetProp( "Rate" ) // Velocidad fotogramas/s
pStatus[8] := oActiveX:GetProp( "SourceProtocol" ) // Protocolo de datos
pStatus[9] := FDate( oActiveX:GetProp( "FileName" ) ) // Fecha creacion
pStatus[10] := FTime( oActiveX:GetProp( "FileName" ) ) // Hora creacion
pStatus[11] := FSize( oActiveX:GetProp( "FileName" ) ) // Tamaño
oActiveX:DO( "Stop" )
oActiveX:End()
DeleteObject( oActiveX )
Return( pStatus )Gracias Rodolfo
Intente compilar y da varios errores, quizas necesite alguna cabecera.
Saludos,
Adhemar
Bueno, como te habia dicho, no lo habia probado.
jajaja, fijate que pasa algo curioso con la pagina del foro, si te pongo el codigo de la funcion en forma de codigo, altera el contenido sustituyendo por ejemplo "oActiveX:SetProp" por "oActiveX:SetProp" , en fin, aqui te adjunto la funcion aunque sea en forma de texto. El problema es que al probarlo me da resultados parciales, por ejemplo la duracion me aparece en cero. Habra que buscarle un poco mas a esta idea para obtener lo que necesitamos.
STATIC Function GetPropFile( oWnd, cFile )
LOCAL oActiveX, pStatus
pStatus:=Array(11)
oActiveX = TActiveX():New( oWnd, "MediaPlayer.MediaPlayer.1",0,0,0,0)
oActiveX:SetProp( "FileName", cFile )
oActiveX:Hide()
pStatus[1] := cFileNoPath( oActiveX:GetProp( "FileName" ) ) // Nombre del fichero
pStatus[2] := cFilePath( oActiveX:GetProp( "FileName" ) ) // Path
pStatus[3] := oActiveX:GetProp( "Duration" ) // Duracion
pStatus[4] := oActiveX:GetProp( "ImageSourceWidth" ) // Ancho fotograma
pStatus[5] := oActiveX:GetProp( "ImageSourceHeight" ) // Alto fotograma
pStatus[6] := oActiveX:GetProp( "BandWidth" ) // Velocidad de datos
pStatus[7] := oActiveX:GetProp( "Rate" ) // Velocidad fotogramas/s
pStatus[8] := oActiveX:GetProp( "SourceProtocol" ) // Protocolo de datos
pStatus[9] := FDate( oActiveX:GetProp( "FileName" ) ) // Fecha creacion
pStatus[10] := FTime( oActiveX:GetProp( "FileName" ) ) // Hora creacion
pStatus[11] := FSize( oActiveX:GetProp( "FileName" ) ) // Tamaño
oActiveX:DO( "Stop" )
oActiveX:End()
DeleteObject( oActiveX )
Return( pStatus )
Salu2
Gracias Rodolfo
Justo falta el dato que necesito.
Esperaré quizas alquien tenga la solución.
Saludos,
Adhemar
#include <windows.h>
#include <dshow.h>
extern "C"
{
#include <hbapi.h>
}
HB_FUNC( GETVIDEODURATION )
{
HRESULT hr;
IGraphBuilder * pGraph;
IMediaSeeking * pMediaSeeking;
wchar_t * lpszFileNameW = hb_mbtowc( hb_parc( 1 ) );
LONGLONG lDurationStream = 0;
hr = CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, ( void ** ) &pGraph );
if( SUCCEEDED( hr ) )
{
hr = pGraph->QueryInterface( IID_IMediaSeeking, ( void ** ) &pMediaSeeking );
if ( SUCCEEDED( hr ) )
{
hr = pGraph->RenderFile( lpszFileNameW, NULL );
if ( SUCCEEDED(hr) )
{
pMediaSeeking->GetDuration( &lDurationStream );
pMediaSeeking->Release();
}else
lDurationStream = -1;
}else
lDurationStream = -2;
}else
lDurationStream = -3;
hb_xfree( lpszFileNameW );
hb_retnl( lDurationStream );
}Hola Daniel
El resultado lo divido entre 60 pero los segundos no coinciden
Ej: el video tienen una duracion de 2:33
Me da 153.267625 dividido entre 60 da 2:55
Gracias por la ayuda
Saludos,
Adhemar
amigo es porque estas haciendo mal la conversion
2:33 son 153 segundos
60+60+33
153 / 60 te da la proporcion en minutos no en segundos.. es decir, 153/60 = 2.55 que son 2 min y 0.55 porciones de un minuto... ahora multiplicamos 0.55 por 60 (para obtener en segundos) es igual a 33 al final unimos todo y tenemos 2:33 segundos
#include "fivewin.ch"
*
Function Main()
Private oDlg, oActiveX,aCoors:=GetCoors( FindWindow("Shell_TrayWnd","") ),aPaths:={}
WinExec("ListVideos.BAT",0) //DIR D:\VIDEOS\*.AVI /-C >D:\VIDEOS\VIDEOS.TXT
oFile:= TTxtFile():New( "D:\VIDEOS\VIDEOS.TXT" )
ZpDir:=""
Do while !oFile:EOF()
cLinea:=oFile:ReadLine()
EsDir:=Subs(cLinea,2,2)
If At(Left(cLinea,1),"0123456789")>0 .or. EsDir="Di"
If EsDir="Di"
cDir:=ALLTRIM(Subs(cLinea,16,60))+"\"
If !ZpDir=cDir
ZpDir:=cDir
Endif
Else
cNom:=AllTrim(Subs(cLinea,42,80))
AADD( aPaths,cDir+cNom )
Endif
Endif
oFile:Skip()
EndDo
oFile:End()
For I=1 to Len(aPaths)
VideoPath:=aPaths[ I ]
If Empty(VideoPath)
MsgAlert("No existe el video","Lo siento")
Return
Endif
DEFINE DIALOG oDlg TITLE UPPER(aPaths[ I ]) FROM 0,1 TO aCoors[1]+5, aCoors[4] PIXEL;oDlg:lHelpIcon := .F.
ACTIVATE DIALOG oDlg CENTER ON INIT MuestraVIDEO()
oDlg:End()
oActiveX:Stop()
Next I
Return NIL
*
STATIC Function MuestraVIDEO()
oActiveX = TActiveX():New( oDlg,"MediaPlayer.MediaPlayer.1",oDlg:nTop, oDlg:nLeft, oDlg:nRight, oDlg:nBottom )
oActiveX:ShowControls:=.T.
oActiveX:Balance:=-10
oActiveX:FileName = VideoPath
Return Nil
*