Page 1 of 1
Mostrar duraccion de Video
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Tue Aug 16, 2011 2:59 pm
by acuellar
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
Re: Mostrar duraccion de Video
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Tue Aug 16, 2011 3:28 pm
by RodolfoRBG
Aunque yo no lo he probado, JLL da la siguiente solucion:
- Code: Select all Expand view
/*------------------------------------------------------------------------------*/
*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 )
Informanos si te fue util. Salu2
Re: Mostrar duraccion de Video
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Tue Aug 16, 2011 3:42 pm
by acuellar
Gracias Rodolfo
Intente compilar y da varios errores, quizas necesite alguna cabecera.
Saludos,
Adhemar
Re: Mostrar duraccion de Video
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Tue Aug 16, 2011 4:17 pm
by RodolfoRBG
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
Re: Mostrar duraccion de Video
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Tue Aug 16, 2011 7:42 pm
by acuellar
Gracias Rodolfo
Justo falta el dato que necesito.
Esperaré quizas alquien tenga la solución.
Saludos,
Adhemar
Re: Mostrar duraccion de Video
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Thu Aug 18, 2011 1:55 am
by Daniel Garcia-Gil
Hola
puede que esta funcion hecha con directshow te sirva, debes crearla en un archivo con extension
CPP y anexarla a tu proyecto
no se si soporta todos los formatos...
descarga el ejemplo de aqui:
http://danielgarciagil.com/fivewin/samples/video.zip- Code: Select all Expand view
#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 );
}
Re: Mostrar duraccion de Video
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Thu Feb 16, 2012 10:52 pm
by acuellar
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
Re: Mostrar duraccion de Video
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Fri Feb 17, 2012 1:12 am
by Daniel Garcia-Gil
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
Re: Mostrar duraccion de Video
![Post Post](./styles/prosilver/imageset/icon_post_target.gif)
Posted:
Fri Feb 17, 2012 7:01 pm
by acuellar
Gracias Daniel
Funcionó, pero aveces sale el valor negativo y no da el resultado correcto hay una diferencia de -40 segundos
Siguiendo con lo de los videos, cargo varias vias de videos a una tabla y quiero que se ejecuten una tras otra, pero no logro captar cuando termina el video para cerrar el dialogo tengo que cerrarla manualmente para que ejecute el siguiente, tambien quiero balancear el volumen pero la instruccion oActiveX:=Balance:=-10 no responde. El balanceo lo quiero para quitar la voz.
Aqui el programa:
- Code: Select all Expand view
#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
*
Gracias por la ayuda
Saludos,
Adhemar