Información sobre los *.AVI

15/09/2004 - 00:15 por Raúl | Informe spam
He encontrado una API que me da informacion acerca de un fichero
que yo le pase, tengo el ejemplo en visual basic y funciona perfecto,
pero cuando lo paso a Foxpro tengo el siguiente problema ...

En el ejemplo de VB se crean un tipo de datos llamado :

Private Type AVIFileInfo
dwMaxBytesPerSec As Long
dwFlags As Long
dwCaps As Long
dwStreams As Long
dwSuggestedBufferSize As Long
dwWidth As Long
dwHeight As Long
dwScale As Long
dwRate As Long
dwLength As Long
dwEditCount As Long
szFileType As String * 64
End Type

En el cual al ejecutar la API, se rellenan todos los datos, pero en foxpro,
la unica forma que he conseguido hacer funcionar la api es poniendo ese
tipo
como cadena y los datos que me devuelve en Foxpro no tiene nada que ver
con los datos de VB, asi que si alguien me puede ayudar ...

La API con la cual estoy teniendo problemas es :

DECLARE INTEGER AVIFileInfo IN "avifil32" INTEGER NFichero, STRING @
FDatos, INTEGER FTamano

P.D. : Por si a alguien le interesa, es para hayar los datos del avi,
ademas del codec de video
y el de audio que se usa. El Codec de video ya se como se obtiene, asi que
ahora me faltan
averiguar las propiedades como duracion, alto y ancho del video y codec de
sonido, asi que
si os interesa avisarme y gracias por leer hasta aqui y por si me puedes
ayudar ^_^




Dim hFile As Long, AviInfo As AVIFileInfo

'initialize the AVIFile library
AVIFileInit
'create a handle to the AVI file
If AVIFileOpen(hFile, Fichero, OF_SHARE_DENY_WRITE, ByVal 0&) = 0 Then
'retrieve the AVI information
If AVIFileInfo(hFile, AviInfo, Len(AviInfo)) = 0 Then
Datos = Str(AviInfo.dwWidth) + "#" + Str(AviInfo.dwHeight)
Else
'MsgBox "Error while retrieving AVI information... :("
End If
'release the file handle
AVIFileRelease hFile
Else
'MsgBox "Error while opening the AVI file... :("
End If
'exit the AVIFile library and decrement the reference count for the
library
AVIFileExit

-
PortalFox :: Nada corre como un zorr
http://www.portalfox.co

PortalFox - NNTP Forum Gatewa

Preguntas similare

Leer las respuestas

#1 Jorge Mota
15/09/2004 - 05:11 | Informe spam
#Define OF_SHARE_DENY_WRITE 0x20
#If .F. && Estructura de Informacion de File Info, puedes remover esto
*Struct AVIFILEINFO
dwMaxBytesPerSec As Long
dwFlags As Long
dwCaps As Long
dwStreams As Long
dwSuggestedBufferSize As Long
dwWidth As Long
dwHeight As Long
dwScale As Long
dwRate As Long
dwLength As Long
dwEditCount As Long
szFileType As String * 64
*EndStruct
#Endif
Declare Long AVIFileOpen In "avifil32" Long @ppfile, String szFile, Long
mode, Long pclsidHandler
Declare Long AVIFileRelease In "avifil32" Long pfile
Declare Long AVIFileInfo In "avifil32" Long NFichero, String @FDatos,
Long FTamano
Declare AVIFileInit In "avifil32"
Declare AVIFileExit In "avifil32"
Local hFile As Long, AviInfo As String
hFile = 10
AviInfo = Replicate(Chr(0),11*4) &&11 los elementos que tiene *4pos. que
ocupa cada uno
AviInfo = AviInfo + Space(64)&&Space(64) &&area para el string que devuelve
AVIFileInit()
cCad = [c:\smstit\ANIMATE\a180.avi]
If AVIFileOpen(@hFile, cCad,OF_SHARE_DENY_WRITE, 0) = 0
If AVIFILEINFO(hFile, @AviInfo, Len(AviInfo)) = 0 Then
messagebox("Tamaño: " + Transform(nRepStruct(AviInfo,6)) + "x"
+ Transform(nRepStruct(AviInfo,7)))

Messagebox(Transform(nRepStruct(AviInfo,1))+Chr(13)+; &&dwMaxBytesPerSec
Transform(nRepStruct(AviInfo,2))+Chr(13)+; &&dwFlags
Transform(nRepStruct(AviInfo,3))+Chr(13)+; &&dwCaps
Transform(nRepStruct(AviInfo,4))+Chr(13)+; &&dwStreams
Transform(nRepStruct(AviInfo,5))+Chr(13)+; &&dwSuggestedBufferSize
Transform(nRepStruct(AviInfo,6))+Chr(13)+; &&dwWidth
Transform(nRepStruct(AviInfo,7))+Chr(13)+; &&dwHeight
Transform(nRepStruct(AviInfo,8))+Chr(13)+; &&dwScale
Transform(nRepStruct(AviInfo,9))+Chr(13)+; &&dwRate
Transform(nRepStruct(AviInfo,10))+Chr(13)+; &&dwLength
Transform(nRepStruct(AviInfo,11))+Chr(13)+; &&dwEditCount
Substr(AviInfo,11*4+1,64)) &&szFileType
Else
MessageBox([No Se pudo obtener las propiedades del archivo]
Endif
AVIFileRelease(hFile)
Else
messagebox("Error al abrir el video")
Endif
AVIFileExit()

Function nRepStruct
Lparameters cEstructura, nValor
Local cCadena, nEmp
nEmp=((nValor-1)*4)+1
cCadena = Substr(cEstructura,nEmp,4)
Return (Asc(Substr(cCadena, 1,1)) +;
BitLShift(Asc(Substr(cCadena, 2,1)), 8)+;
BitLShift(Asc(Substr(cCadena, 3,1)), 16)+;
BitLShift(Asc(Substr(cCadena, 4,1)), 24))
Endfunc

si no se ve bien, me das un email y te lo mando.
Saludos.



On Tue, 14 Sep 2004 15:15:21 -0700, Raúl wrote:

He encontrado una API que me da informacion acerca de un fichero
que yo le pase, tengo el ejemplo en visual basic y funciona perfecto,
pero cuando lo paso a Foxpro tengo el siguiente problema ...

En el ejemplo de VB se crean un tipo de datos llamado :

Private Type AVIFileInfo
dwMaxBytesPerSec As Long
dwFlags As Long
dwCaps As Long
dwStreams As Long
dwSuggestedBufferSize As Long
dwWidth As Long
dwHeight As Long
dwScale As Long
dwRate As Long
dwLength As Long
dwEditCount As Long
szFileType As String * 64
End Type

En el cual al ejecutar la API, se rellenan todos los datos, pero en
foxpro,
la unica forma que he conseguido hacer funcionar la api es poniendo ese
tipo
como cadena y los datos que me devuelve en Foxpro no tiene nada que ver
con los datos de VB, asi que si alguien me puede ayudar ...

La API con la cual estoy teniendo problemas es :

DECLARE INTEGER AVIFileInfo IN "avifil32" INTEGER NFichero, STRING @
FDatos, INTEGER FTamano

P.D. : Por si a alguien le interesa, es para hayar los datos del avi,
ademas del codec de video
y el de audio que se usa. El Codec de video ya se como se obtiene, asi
que
ahora me faltan
averiguar las propiedades como duracion, alto y ancho del video y codec
de
sonido, asi que
si os interesa avisarme y gracias por leer hasta aqui y por si me puedes
ayudar ^_^




Dim hFile As Long, AviInfo As AVIFileInfo
'initialize the AVIFile library
AVIFileInit
'create a handle to the AVI file
If AVIFileOpen(hFile, Fichero, OF_SHARE_DENY_WRITE, ByVal 0&) = 0
Then
'retrieve the AVI information
If AVIFileInfo(hFile, AviInfo, Len(AviInfo)) = 0 Then
Datos = Str(AviInfo.dwWidth) + "#" + Str(AviInfo.dwHeight)
Else
'MsgBox "Error while retrieving AVI information... :("
End If
'release the file handle
AVIFileRelease hFile
Else
'MsgBox "Error while opening the AVI file... :("
End If
'exit the AVIFile library and decrement the reference count for the
library
AVIFileExit


PortalFox :: Nada corre como un zorro
http://www.portalfox.com

PortalFox - NNTP Forum Gateway





Jorge Mota
Microsoft Visual FoxPro MVP
Guatemala
Respuesta Responder a este mensaje
#2 Raúl
16/09/2004 - 18:57 | Informe spam
He estado mirando mas información acerca de los avis,
el ejemplo que me pusiste funciona a la perfeccion
asi que muchas gracias lo primero por la ayuda que me
has proporcionado ^_^

Como te comentaba al inicio, he buscado mas informacion
acerca del tema y veo que hay otra API que tambien
puede usarse, la API es AVIStreamInfo , pero no consigo
encontrar un ejemplo ni en vb ni en foxpro, lo he visto en
esta web ...

http://www.news2news.com/vfp/?examp...functionq3

pero no se puede acceder al codigo sino estas
registrado, asi que no se si has trabajado tu ya
antes con esto, si es asi y sabes de alguna documentación
te agradeceria si me podrias decir donde obtenerla
para leerla, o sino si sabes donde puedo encontrar
algun ejemplo, porque en google al final me he vuelto loko
de buscar, x P


Bueno pues eso es todo xDDDD que no es poco, asi que si me puedes
ayudar te lo agradeceria, sino de todas formas gracias por las molestias
que te has tomado y suerte.


-
PortalFox :: Nada corre como un zorr
http://www.portalfox.co

PortalFox - NNTP Forum Gatewa
Respuesta Responder a este mensaje
#3 Jorge Mota
16/09/2004 - 23:08 | Informe spam
bueno, esto es lo que he logrado armar, creo que los primeros 2 elementos
te dan algo de info sobre el codec, de alli no veo gran cosa :p
=>Corte Aqui
#If .F.
*Struct Rect
Left;
Top;
Right;
Bottom;
*endStruct
*struct AVISTREAMINFO
fccType;
fccHandler;
dwFlags;
dwCaps;
wPriority;
wLanguage;
dwScale;
dwRate;
dwStart;
dwLength;
dwInitialFrames;
dwSuggestedBufferSize;
dwQuality;
dwSampleSize;
RECT rcFrame; &&este contiene 4 elementos
dwEditCount;
dwFormatChangeCount;
char szName[64];
*endStruct
}


#Endif
Declare Long AVIStreamRelease In AviFil32 Long pAvi
Declare Long AVIStreamInfo In avifil32 ;
Long pAvi,String @psi,Long lSize
Declare Long AVIStreamOpenFromFile In avifil32 ;
Long @PAVISTREAM, String @LPCTSTR, Long DWORD,;
Long Lparam, Integer mode, String pclsidHandler

Local nHandle, cInfo,nSize
cInfo = Replicate(Chr(0),20*4)+Space(64)
nHandle = 0
cFile = [d:\Peliculas\Diablo\Diablo_Peli.avi]
If AVIStreamOpenFromFile(@nHandle,cFile,0,0,0x20,.Null.)=0
If AVIStreamInfo(nHandle,@cInfo,Len(cInfo)*4)=0
Clear
?[fccType: ]+ Substr(cInfo,1,4)
?[fccHandler:]+Substr(cInfo,5,4)
?[dwFlags:]+Transform(nRepStruct(cInfo,3))
?[dwCaps:]+Transform(nRepStruct(cInfo,4))
?[wPriority:]+Transform(nRepStruct(cInfo,5))
?[wLanguage:]+Transform(nRepStruct(cInfo,6))
?[dwScale:]+Transform(nRepStruct(cInfo,7))
?[dwRate:]+Transform(nRepStruct(cInfo,8))
?[dwStart:]+Transform(nRepStruct(cInfo,9))
?[dwLength:]+Trans(nRepStruct(cInfo,10))
?[dwInitialFrames:]+Transform(nRepStruct(cInfo,11))
?[dwSuggestedBufferSize:]+Transform(nRepStruct(cInfo,12))
?[dwQuality:]+Transform(nRepStruct(cInfo,13))
?[dwSampleSize:]+Transform(nRepStruct(cInfo,14) )
?[Rect Left:]+Transform(nRepStruct(cInfo,15))
?[Rect Top:]+Transform(nRepStruct(cInfo,16))
?[Rect Right:]+Transform(nRepStruct(cInfo,17))
?[Rect Bottom:]+Transform(nRepStruct(cInfo,18))
?[dwEditCount:]+Transform(nRepStruct(cInfo,19))
?[dwFormatChangeCount:]+Transform(nRepStruct(cInfo,20))
?Substr(cInfo,(20*4)-3,63 )
Else
Messagebox("Error al obtener Informacion")
Endif
Else
Messagebox("Error al Abrir el archivo")
Return
Endif
AVIStreamRelease(nHandle)

Function nRepStruct
Lparameters cEstructura, nValor
Local cCadena, nEmp
nEmp=((nValor-1)*4)+1
cCadena = Substr(cEstructura,nEmp,4)
Return ((Asc(Substr(cCadena, 1,1)) +;
BitLShift(Asc(Substr(cCadena, 2,1)), 8)+;
BitLShift(Asc(Substr(cCadena, 3,1)), 16)+;
BitLShift(Asc(Substr(cCadena, 4,1)), 24)))
Endfunc

*Si se necesita saber cual es el codigo de cuatro caracteres
*dado por FccHandler, luego de obtener el AviStreamInfo
Declare Long mmioStringToFOURCC in "winmm.dll" String sz, Long uFlags
??[ FOURCC=]+Transform(mmioStringToFOURCC(Substr(cInfo,5,4),0))

=>Hasta Aqui

Te pego como dato adicional la info sobre la estructura
=>Corte Aqui
AVISTREAMINFO
The AVISTREAMINFO structure contains information for a single stream.

typedef struct {
DWORD fccType;
DWORD fccHandler;
DWORD dwFlags;
DWORD dwCaps;
WORD wPriority;
WORD wLanguage;
DWORD dwScale;
DWORD dwRate;
DWORD dwStart;
DWORD dwLength;
DWORD dwInitialFrames;
DWORD dwSuggestedBufferSize;
DWORD dwQuality;
DWORD dwSampleSize;
RECT rcFrame;
DWORD dwEditCount;
DWORD dwFormatChangeCount;
char szName[64];
} AVISTREAMINFO;

Members

fccType

Four-character code indicating the stream type. The following constants
have been defined for the data commonly found in AVI streams:

Constant Description
streamtypeAUDIO Indicates an audio stream.
streamtypeMIDI Indicates a MIDI stream.
streamtypeTEXT Indicates a text stream.
streamtypeVIDEO Indicates a video stream.


fccHandler

Four-character code of the compressor handler that will compress this
video stream when it is saved (for example, mmioFOURCC('M','S','V','C')).
This member is not used for audio streams.

dwFlags

Applicable flags for the stream. The bits in the high-order word of these
flags are specific to the type of data contained in the stream. The
following flags are defined:

AVISTREAMINFO_DISABLED

Indicates this stream should be rendered when explicitly enabled by the
user.

AVISTREAMINFO_FORMATCHANGES

Indicates this video stream contains palette changes. This flag warns the
playback software that it will need to animate the palette.

dwCaps

Capability flags; currently unused.

wPriority

Priority of the stream.

wLanguage

Language of the stream.

dwScale

Time scale applicable for the stream. Dividing dwRate by dwScale gives the
playback rate in number of samples per second.

For video streams, this rate should be the frame rate. For audio streams,
this rate should correspond to the audio block size (the nBlockAlign
member of the WAVEFORMAT or PCMWAVEFORMAT structure), which for PCM (Pulse
Code Modulation) audio reduces to the sample rate.

dwRate

Rate in an integer format. To obtain the rate in samples per second,
divide this value by the value in dwScale.

dwStart

Sample number of the first frame of the AVI file. The units are defined by
dwRate and dwScale. Normally, this is zero, but it can specify a delay
time for a stream that does not start concurrently with the file.

The 1.0 release of the AVI tools does not support a nonzero starting time.

dwLength

Length of this stream. The units are defined by dwRate and dwScale.

dwInitialFrames

Audio skew. This member specifies how much to skew the audio data ahead of
the video frames in interleaved files. Typically, this is about 0.75
seconds.

dwSuggestedBufferSize

Recommended buffer size, in bytes, for the stream. Typically, this member
contains a value corresponding to the largest chunk in the stream. Using
the correct buffer size makes playback more efficient. Use zero if you do
not know the correct buffer size.

dwQuality

Quality indicator of the video data in the stream. Quality is represented
as a number between 0 and 10,000. For compressed data, this typically
represents the value of the quality parameter passed to the compression
software. If set to - 1, drivers use the default quality value.

dwSampleSize

Size, in bytes, of a single data sample. If the value of this member is
zero, the samples can vary in size and each data sample (such as a video
frame) must be in a separate chunk. A nonzero value indicates that
multiple samples of data can be grouped into a single chunk within the
file.

For video streams, this number is typically zero, although it can be
nonzero if all video frames are the same size. For audio streams, this
number should be the same as the nBlockAlign member of the WAVEFORMAT or
WAVEFORMATEX structure describing the audio.

rcFrame

Dimensions of the video destination rectangle. The values represent the
coordinates of upper left corner, the height, and the width of the
rectangle.

dwEditCount

Number of times the stream has been edited. The stream handler maintains
this count.

dwFormatChangeCount

Number of times the stream format has changed. The stream handler
maintains this count.

szName

Null-terminated string containing a description of the stream.
=>Hasta Aqui

***Tomado del MSDN


On Thu, 16 Sep 2004 09:57:26 -0700, Raúl wrote:

He estado mirando mas información acerca de los avis,
el ejemplo que me pusiste funciona a la perfeccion
asi que muchas gracias lo primero por la ayuda que me
has proporcionado ^_^

Como te comentaba al inicio, he buscado mas informacion
acerca del tema y veo que hay otra API que tambien
puede usarse, la API es AVIStreamInfo , pero no consigo
encontrar un ejemplo ni en vb ni en foxpro, lo he visto en
esta web ...

http://www.news2news.com/vfp/?examp...functionq3

pero no se puede acceder al codigo sino estas
registrado, asi que no se si has trabajado tu ya
antes con esto, si es asi y sabes de alguna documentación
te agradeceria si me podrias decir donde obtenerla
para leerla, o sino si sabes donde puedo encontrar
algun ejemplo, porque en google al final me he vuelto loko
de buscar, x P


Bueno pues eso es todo xDDDD que no es poco, asi que si me puedes
ayudar te lo agradeceria, sino de todas formas gracias por las molestias
que te has tomado y suerte.



PortalFox :: Nada corre como un zorro
http://www.portalfox.com

PortalFox - NNTP Forum Gateway





Jorge Mota
Microsoft Visual FoxPro MVP
Guatemala
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida