Afficher la durée d'un film

Signaler
Messages postés
265
Date d'inscription
dimanche 3 août 2003
Statut
Membre
Dernière intervention
29 mars 2010
-
Messages postés
265
Date d'inscription
dimanche 3 août 2003
Statut
Membre
Dernière intervention
29 mars 2010
-
Salut !
Je cherche un moyen d'aaficher la durée d'un film a partir d'un fichier avi . Comment faire ?
(mciSendString ? mediainfo.dll ?)

merci

Clad

8 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
salut,
mci est approprié oui, mais de mémoire tu est obligé de commencer à le charger, donc de mettre en place le process d'ALIAS

(juste pour dire que je crois que çà ne se fera pas juste en une ligne de code)
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
et voilà
http://www.codyx.org/snippet_obtenir-duree-fichier-avi_583.aspx

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
265
Date d'inscription
dimanche 3 août 2003
Statut
Membre
Dernière intervention
29 mars 2010

lut !

Mici pour ta réponce rapide (comme d'hab ;)

J'ai des petits pb a retraduire le code en vb 2008.

Voila ce que j'ai du faire :

Private

Declare
Function mciExecute
Lib
"winmm.dll" (
ByVal lpstrCommand
As
String)
As
Long

Private
Declare
Function mciSendString
Lib
"winmm.dll"
Alias
"mciSendStringA" (
ByVal lpstrCommand
As
String,
ByVal lpstrReturnString
As
String,
ByVal uReturnLength
As
Long,
ByVal hwndCallback
As
Long)
As
Long

Function GetAviDuration(
ByVal sPath
As
String)
As
Long

' retourne la dur‚e du fichier AVI en secondes

Dim sAlias
As
String

Dim lRet
As
Long

Dim sBuffer
As
StringsAlias =

"FONCTION_MCI_" &
CStr(Now)

' chargement

Call mciExecute(
"OPEN " & sPath &
" TYPE AVIVIDEO ALIAS " & sAlias &
" STYLE POPUP")

' on r‚cupŠre les ms totalessBuffer =

New
String(128, vbNullChar) '  ERREUR ICI !!!!

Call mciSendString(
"SET " & sAlias &
" TIME FORMAT MS", sBuffer, Len(sBuffer), 0&)lRet = mciSendString(

"STATUS " & sAlias &
" LENGTH", sBuffer, Len(sBuffer), 0&)

' retourGetAviDuration = Val(LeftB$(sBuffer, InStr(sBuffer, vbNullChar))) \ 1000

' stop

Call mciExecute(
"CLOSE " & sAlias)

End
Function

Public
Shared
Function LeftB(
ByVal stTarget
As
String,
ByVal iByteSize
As
Integer)
As
String

Return MidB(stTarget, 1, iByteSize)

End
Function

Public
Shared
Function MidB(
ByVal stTarget
As
String,
ByVal iStart
As
Integer)
As
String

Dim hEncoding
As System.Text.Encoding = System.Text.Encoding.GetEncoding(
"Shift_JIS")

Dim bBytes
As
Byte() = hEncoding.GetBytes(stTarget)

Return hEncoding.GetString(bBytes, iStart - 1, bBytes.Length - iStart + 1)

End
Function

Public
Shared
Function MidB(
ByVal stTarget
As
String,
ByVal iStart
As
Integer,
ByVal iByteSize
As
Integer)
As
String

Dim hEncoding
As System.Text.Encoding = System.Text.Encoding.GetEncoding(
"Shift_JIS")

Dim bBytes
As
Byte() = hEncoding.GetBytes(stTarget)

Return hEncoding.GetString(bBytes, iStart - 1, iByteSize)

End
Function

Public
Shared
Function RightB(
ByVal stTarget
As
String,
ByVal iByteSize
As
Integer)
As
String

Dim hEncoding
As System.Text.Encoding = System.Text.Encoding.GetEncoding(
"Shift_JIS")

Dim bBytes
As
Byte() = hEncoding.GetBytes(stTarget)

Return hEncoding.GetString(bBytes, bBytes.Length - iByteSize, iByteSize)

End
Function

Private
Sub Button1_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles Button1.ClickOpenFileDialog1.ShowDialog()

MsgBox(GetAviDuration(OpenFileDialog1.SafeFileName))

End
SubJ'ai du trouver comment faire pour remplacé les leftB et les autres non connu sous net.

Mais tout beug :s

Clad
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
salut,

j'touche déjà pas à 2005 alors 2008..., n'en parlons même pas

avec un peu de change un dotnetien va passer ou modifier le snippet pour 2005....
désolé

bon courage
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
265
Date d'inscription
dimanche 3 août 2003
Statut
Membre
Dernière intervention
29 mars 2010

Public






Class
Form1


'API Windows Multmedia … laquelle on envoit des commandes






Private



Declare



Function
mciSendString

Lib



"winmm.dll"



Alias



"mciSendStringA"
(

ByVal
lpstrCommand

As



String
,

ByVal
lpstrReturnString

As



String
,

ByVal
uReturnLength

As



Long
,

ByVal
hwndCallback

As



Long
)

As



Long 

 








Private



Function
DureeFichier(

ByVal
sFichier

As



String
)

As



String 

 








'On cr‚e un buffer de 128






Dim
sRetString

As



String
= Space(128) 


On



Error



Resume



Next 

 








'on ferme fichier au cas o— il serait ouvert

mciSendString(




"close fichier"
, 0, 0, 0)


'on ouvre le fichier pass‚ en paramŠtre

mciSendString(




"open """
& sFichier &

""" type MPEGVideo alias fichier"
, 0, 0, 0)


'on rŠgle le format temporel sur milliseconde

mciSendString(




"set fichier time format ms"
, 0, 0, 0)


'on r‚cupŠre la dur‚e du fichier dans le buffer

mciSendString(




"status fichier length"
, sRetString, 128, 0)


'on passe cette dur‚e … la fonction FormatTemps et on l'affecte … la valeur de notre fonction

DureeFichier = FormatTemps(




CDbl
(Replace(sRetString, Chr(0),

""
) / 1000))


'et enfin on ferme fichier

mciSendString(




"close fichier"
, 0, 0, 0)


End



Function






'Fonction qui renvoie la dur‚e format‚e ainsi 00:00:00






Private



Function
FormatTemps(

ByVal
dTemps

As



Double
)

As



String






Dim
lHeure

As



Long






Dim
lMinute

As



Long






Dim
lSeconde

As



Long






Dim
lTemps

As



Long 

 



lTemps = Math.Round(dTemps)


lHeure = Int(lTemps / 3600)


lMinute = Int((lTemps - 3600 * lHeure) / 60)


lSeconde = lTemps - 3600 * lHeure - 60 * lMinute


FormatTemps = Format(lHeure,




"00"
) &

":"
& Format(lMinute,

"00"
) &

":"
& Format(lSeconde,

"00"
)


End



Function 








Private



Sub
Button1_Click(

ByVal
sender

As
System.Object,

ByVal
e

As
System.EventArgs)

Handles
Button1.ClickOpenFileDialog1.ShowDialog()

MsgBox(DureeFichier(OpenFileDialog1.SafeFileName))


End



SubEnd





Class



Version qui fonctionne en vb 2008

Clad
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
48
ah mais çà va pas du tout çà Clad

déjà pour l'API c'est en interger (déclaration) pour dotnet

ensuite la moitié est codé à la VB6
"on error resume next" ???
d'une part il faudrait remplacer par un catch, d'autre pourquoi veux-tu qu'il y ait une erreur, il y a un retour de l'API pour te signaler de lire l'erreur par l'API getlasterror

space(128), à mon avis çà n'existe pas en dotnet, il te faut décocher la compatibilité de langage
çà doit être un stringbuilder puis var.lenght=128
(ce qui va ensuite poser problème pour le passage d'argument à l'API)

je suis certain qu'il y a bien plus DOTNET à faire que ce code

fais un tour dans les sources existantes dans le doute...
++ bonne soirée
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
265
Date d'inscription
dimanche 3 août 2003
Statut
Membre
Dernière intervention
29 mars 2010

salut !

En faite c un code vb6 que g trouvé sur le méme site que tu ma donnée.
Le space(128) et une chose que j'ai remplacé (origine : Dim sRetString As String * 128, pas reconnue en vb 2005 ou 2008)

Le code que j'ai posté en dernier fonctionne, je ne l'ai pas encore optimisé bientot peut étre.
Je n'ai pas trouvé d'aide plus DotNet comme tu dit ;)

Clad
Messages postés
265
Date d'inscription
dimanche 3 août 2003
Statut
Membre
Dernière intervention
29 mars 2010