Page 1 of 1

Mostrar duraccion de Video

PostPosted: 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

PostPosted: 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

PostPosted: 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

PostPosted: 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

PostPosted: 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

PostPosted: 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

PostPosted: 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

PostPosted: 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

PostPosted: 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&#058;Stop()
   
   Next I  

Return NIL
*
STATIC Function MuestraVIDEO()
  oActiveX = TActiveX():New( oDlg,"
MediaPlayer.MediaPlayer.1",oDlg:nTop, oDlg:nLeft, oDlg:nRight, oDlg:nBottom )

  oActiveX&#058;ShowControls:=.T.
  oActiveX&#058;Balance:=-10
  oActiveX&#058;FileName = VideoPath

Return Nil
*



Gracias por la ayuda

Saludos,

Adhemar