Mostrar duraccion de Video

Mostrar duraccion de Video

Postby acuellar » Tue Aug 16, 2011 2:59 pm

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
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1594
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Mostrar duraccion de Video

Postby RodolfoRBG » Tue Aug 16, 2011 3:28 pm

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
RodolfoRBG
FWH 1307, xHarbour123 BCC582
rodolfoerbg@gmail.com
User avatar
RodolfoRBG
 
Posts: 257
Joined: Tue May 16, 2006 4:46 pm
Location: San Luis Potosi, SLP, Mexico

Re: Mostrar duraccion de Video

Postby acuellar » Tue Aug 16, 2011 3:42 pm

Gracias Rodolfo

Intente compilar y da varios errores, quizas necesite alguna cabecera.

Saludos,

Adhemar
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1594
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Mostrar duraccion de Video

Postby RodolfoRBG » Tue Aug 16, 2011 4:17 pm

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
RodolfoRBG
FWH 1307, xHarbour123 BCC582
rodolfoerbg@gmail.com
User avatar
RodolfoRBG
 
Posts: 257
Joined: Tue May 16, 2006 4:46 pm
Location: San Luis Potosi, SLP, Mexico

Re: Mostrar duraccion de Video

Postby acuellar » Tue Aug 16, 2011 7:42 pm

Gracias Rodolfo

Justo falta el dato que necesito.

Esperaré quizas alquien tenga la solución.

Saludos,

Adhemar
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1594
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Mostrar duraccion de Video

Postby Daniel Garcia-Gil » Thu Aug 18, 2011 1:55 am

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 );
}
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Mostrar duraccion de Video

Postby acuellar » Thu Feb 16, 2012 10:52 pm

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
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1594
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Mostrar duraccion de Video

Postby Daniel Garcia-Gil » Fri Feb 17, 2012 1:12 am

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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Mostrar duraccion de Video

Postby acuellar » Fri Feb 17, 2012 7:01 pm

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
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1594
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 71 guests