FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Mostrar duraccion de Video
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Mostrar duraccion de Video
Posted: Tue Aug 16, 2011 02: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.
Posts: 257
Joined: Tue May 16, 2006 04:46 PM
Re: Mostrar duraccion de Video
Posted: Tue Aug 16, 2011 03:28 PM
Aunque yo no lo he probado, JLL da la siguiente solucion:

Code (fw): Select all Collapse
/*------------------------------------------------------------------------------*/
*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
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Mostrar duraccion de Video
Posted: Tue Aug 16, 2011 03:42 PM

Gracias Rodolfo

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

Saludos,

Adhemar

Saludos,



Adhemar C.
Posts: 257
Joined: Tue May 16, 2006 04:46 PM
Re: Mostrar duraccion de Video
Posted: Tue Aug 16, 2011 04: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
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Mostrar duraccion de Video
Posted: Tue Aug 16, 2011 07:42 PM

Gracias Rodolfo

Justo falta el dato que necesito.

Esperaré quizas alquien tenga la solución.

Saludos,

Adhemar

Saludos,



Adhemar C.
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Mostrar duraccion de Video
Posted: Thu Aug 18, 2011 01: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 (fw): Select all Collapse
#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 );
}
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Mostrar duraccion de Video
Posted: 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.
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Mostrar duraccion de Video
Posted: Fri Feb 17, 2012 01: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

Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Mostrar duraccion de Video
Posted: Fri Feb 17, 2012 07: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 (fw): Select all Collapse
#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
Saludos,



Adhemar C.

Continue the discussion