Page 1 sur 2
[..] Extraire les chapîtres d'une playlist AVCHD
Posté : jeu. 11 oct. 2012 15:41
par Anthony
Bonjour à tous
Voilà en fait je cherche à récupérer la liste des chapîtres qui ont l'air de se trouver dans le fichier
PLAYLIST\00000.mpls affiché par TSmuxer comme ceci:
Code : Tout sélectionner
00:00:00.000[color=#8000FF]@CRLF[/color]
00:01:24.375[color=#8000FF]@CRLF[/color]
00:04:39.987[color=#8000FF]@CRLF[/color]
00:08:26.129[color=#8000FF]@CRLF[/color]
00:10:46.770[color=#8000FF]@CRLF[/color]
00:12:52.645[color=#8000FF]@CRLF[/color]
00:16:52.427[color=#8000FF]@CRLF[/color]
00:20:07.748[color=#8000FF]@CRLF[/color]
00:23:38.875[color=#8000FF]@CRLF[/color]
Le tout étant de ne pas utiliser TSmuxer ou autre, uniquement en code AutoIt enfin si c'est faisable
Inclu:
PLAYLIST\00000.mpls
STREAM\00000.m2ts
Dossier BDMV - Pour extraction Chapitres.rar =>
http://ul.to/j6izjc75
Merci d'avance
Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : jeu. 11 oct. 2012 16:58
par mikell
AMHA pas moyen sans soft externe
The details of BluRay and the AVCHD structures are not highly publicized
since the BluRay Consortium is more interested in discouraging pirating than
they are in assisting people who wish to write their own authoring programs.
There is a formal spec which has been published and updated but it is
expensive and limited in its distribution to members of the Consortium.
Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : jeu. 11 oct. 2012 17:18
par Anthony
Voici sous Hedit la playlist 00000.mpls
Pour moi les infos commencent à partir de 00000000A8, 00000000B6, etc... je compte 9 FF FF comme 9 chapîtres
çà serai pas une conversion genre hexa,ascii, etc............
Code : Tout sélectionner
00:00:00.000
00:01:24.375
00:04:39.987
00:08:26.129
00:10:46.770
00:12:52.645
00:16:52.427
00:20:07.748
00:23:38.875

Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : jeu. 11 oct. 2012 18:47
par mikell
Très probablement

Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : jeu. 11 oct. 2012 19:30
par Anthony
Une idée ?

Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : jeu. 11 oct. 2012 19:35
par mikell
Absolument pas

Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : jeu. 11 oct. 2012 23:57
par Anthony
Bon bah si quelqu'un à une idée je suis preneur

Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : ven. 12 oct. 2012 04:12
par Anthony
Bon j'ai éssayé de décrypter les millisecondes 00:00:00.
999
Code : Tout sélectionner
00 9B FC C0 à 00 9B FC EC = 00:00:00.[color=#0000FF]000[/color] Différence 2C soit 44
00 9B FC ED à 00 9B FD 19 = 00:00:00.[color=#0000FF]001[/color] Différence 2C soit 44
00 9B FD 1A à 00 9B FD 46 = 00:00:00.[color=#0000FF]002[/color] Différence 2C soit 44
00 9B FD 47 à 00 9B FD 73 = 00:00:00.[color=#0000FF]003[/color] Différence 2C soit 44
00 9B FD 74 à 00 9B FD A0 = 00:00:00.[color=#0000FF]004[/color] Différence 2C soit 44
00 9B FD A1 à 00 9B FD CD = 00:00:00.[color=#0000FF]005[/color] Différence 2C soit 44
00 9B FD CE à 00 9B FD FA = 00:00:00.[color=#0000FF]006[/color] Différence 2C soit 44
00 9B FD FB à 00 9B FE 27 = 00:00:00.[color=#0000FF]007[/color] Différence 2C soit 44
00 9B FE 28 à 00 9B FE 54 = 00:00:00.[color=#0000FF]008[/color] Différence 2C soit 44
00 9B FE 55 à 00 9B FE 81 = 00:00:00.[color=#0000FF]009[/color] Différence 2C soit 44
00 9B FE 82 à 00 9B FE AE = 00:00:00.[color=#0000FF]010[/color] Différence 2C soit 44
00 9B FE AF à 00 9B FE DB = 00:00:00.[color=#0000FF]011[/color] Différence 2C soit 44
00 9C AC 5B = 00:00:00.[color=#0000FF]999[/color] etc...
Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : dim. 14 oct. 2012 12:23
par mikell
Tin, tu me fais faire des trucs impossibles
ça va que j'aime bien les challenges et que là j'ai un peu de temps...
Celle-là oui, tu peux la mettre dans les exemples de script, tu pourrais même sans rougir la poster sur le forum US ^^
► Afficher le texte
Code : Tout sélectionner
; analyse de fichier playlist *.mpls
Global $mfile = "00000.mpls", $m2ts, $info, $n = 82, $ch, $chap[1]
$size = FileGetSize($mfile)
$mpls = FileOpen($mfile, 16)
$tmp = _ReadZeHex($mpls, 70, 9)
For $i = 0 to UBound($tmp)-1
$m2ts &= StringLower(Chr($tmp[$i]))
If $i = 4 Then $m2ts &= "."
Next
$info &= "fichier m2ts" & @TAB & $m2ts & @crlf&@crlf
$in = _GetZeBin($mpls, $n)
$info &= "point d'entrée" & @TAB & _Display($in) & @crlf
$out = _GetZeBin($mpls, $n+4)
$info &= "point de sortie" & @TAB & _Display($out) & @crlf
$dur = $out - $in
$info &= "Durée totale" & @TAB & _Display($dur) & @crlf&@crlf
For $i = $n+8 to $size-1
If _Chapitres($mpls, $i) Then
$chap[$ch] = _GetZeBin($mpls, $i-4)
$info &= "Chapitre " & StringFormat("%02i", $ch) & @TAB & _Display($chap[$ch]-$in) & @crlf ;<< rectif /point d'entree
$ch += 1
ReDim $chap[$ch+1]
EndIf
Next
FileClose($mpls)
Msgbox(0, $mfile, $info)
;================================================
Func _ReadZeHex($file, $pos, $n)
Local $char[$n]
FileSetPos($file, $pos, 0) ;$FILE_BEGIN
For $i = 0 to $n-1
$char[$i] = FileRead($file, 1)
;; If StringLen($char[$i])<>4 Then _Error($file, $pos, "données illisibles")
Next
Return $char
EndFunc
Func _GetZeBin($file, $pos)
Local $char = _ReadZeHex($file, $pos, 4)
$bin = Dec(StringTrimLeft(Binary($char[0] & $char[1] & $char[2] & $char[3]), 2) )
;; $bin = BitShift($char[0], -24) + BitShift($char[1], -16) + BitShift($char[2], -8) + BitShift($char[3], 0)
Return $bin
EndFunc
Func _Chapitres($file, $pos)
Local $char = _ReadZeHex($file, $pos, 4), $str
$str = StringFormat("%.2X%.2X%.2X%.2X", $char[0], $char[1], $char[2], $char[3]) ; hexa
If $str= "FFFF0000" Then
Return 1
Else
Return 0
EndIf
EndFunc
Func _Display($pts)
$sec = $pts/45000
Return StringFormat("%02.0f:%02.0f:%06.3f", Floor($sec/3600), Floor(Mod($sec, 3600)/60), Mod($sec, 60) )
EndFunc
Tu remarqueras que le point d'entrée n'étant pas mis à 0 par tsmuxer, il faut en tenir compte pour l'affichage de valeurs corrigées de chapitres
Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : dim. 14 oct. 2012 15:35
par Anthony
Ouahhhh c'est faisable

merci mikell
Par contre c'est sur une playlist au hazard ou venant de TSmuxer et si TSmuxer es-ce en format
AVCHD disk ou
Blu-ray disk ?
En fait j'ai éssayé sur une playlist de Bluray et Scite me retourne:
Code : Tout sélectionner
C:\Test\Include\_Include_Extract_Chapters_List.au3 (47) : ==> Unknown function name.:
FileSetPos($file, $pos, 0)
^ ERROR
_Include_Extract_Chapters_List.au3
► Afficher le texte
Code : Tout sélectionner
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.0.0
From idea of: Web Free Software
Author: mikell
Script Function:
_Include_Extract_Chapters_List.au3.
#ce ----------------------------------------------------------------------------
; analyse de fichier playlist *.mpls
Global $mfile = "O:\BDMV\PLAYLIST\00800.mpls", $m2ts, $info, $n = 82, $ch, $chap[1]
$size = FileGetSize($mfile)
$mpls = FileOpen($mfile, 16)
$tmp = _ReadZeHex($mpls, 70, 9)
For $i = 0 to UBound($tmp)-1
$m2ts &= StringLower(Chr($tmp[$i]))
If $i = 4 Then $m2ts &= "."
Next
$info &= "fichier m2ts" & @TAB & $m2ts & @crlf&@crlf
$in = _GetZeBin($mpls, $n)
$info &= "point d'entrée" & @TAB & _Display($in) & @crlf
$out = _GetZeBin($mpls, $n+4)
$info &= "point de sortie" & @TAB & _Display($out) & @crlf
$dur = $out - $in
$info &= "Durée totale" & @TAB & _Display($dur) & @crlf&@crlf
For $i = $n+8 to $size-1
If _Chapitres($mpls, $i) Then
$chap[$ch] = _GetZeBin($mpls, $i-4)
$info &= "Chapitre " & StringFormat("%02i", $ch) & @TAB & _Display($chap[$ch]-$in) & @crlf ;<< rectif /point d'entree
$ch += 1
ReDim $chap[$ch+1]
EndIf
Next
FileClose($mpls)
Msgbox(0, $mfile, $info)
;================================================
Func _ReadZeHex($file, $pos, $n)
Local $char[$n]
FileSetPos($file, $pos, 0) ;$FILE_BEGIN
For $i = 0 to $n-1
$char[$i] = FileRead($file, 1)
;; If StringLen($char[$i])<>4 Then _Error($file, $pos, "données illisibles")
Next
Return $char
EndFunc
Func _GetZeBin($file, $pos)
Local $char = _ReadZeHex($file, $pos, 4)
$bin = Dec(StringTrimLeft(Binary($char[0] & $char[1] & $char[2] & $char[3]), 2) )
;; $bin = BitShift($char[0], -24) + BitShift($char[1], -16) + BitShift($char[2], -8) + BitShift($char[3], 0)
Return $bin
EndFunc
Func _Chapitres($file, $pos)
Local $char = _ReadZeHex($file, $pos, 4), $str
$str = StringFormat("%.2X%.2X%.2X%.2X", $char[0], $char[1], $char[2], $char[3]) ; hexa
If $str= "FFFF0000" Then
Return 1
Else
Return 0
EndIf
EndFunc
Func _Display($pts)
$sec = $pts/45000
Return StringFormat("%02.0f:%02.0f:%06.3f", Floor($sec/3600), Floor(Mod($sec, 3600)/60), Mod($sec, 60) )
EndFunc
Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : dim. 14 oct. 2012 16:25
par mikell
J'ai travaillé sur ta liste qui apparemment sort de tsmuxer en AVCHD
Pour l'erreur "Unknown function name", passe à la version autoit 3.3.6.1 (la fonction FileSetPos n'est pas dans ta 3.3.0.0)
Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : dim. 14 oct. 2012 18:35
par Anthony
Tout à fait, une mise à jour à résolu le problème.

Je te passe une playlist de bluray 3D
00800.mpls dont la durée totale = 01:47:59.846 sous TSmuxer
- 00800.rar
- 00800.mpls (rar)
- (495 Octets) Téléchargé 159 fois
00001.m2ts 01:47:58.846
00003.m2ts 00:00:01.000 (Il peut aussi avoir plus de m2ts sur certaines playlist)
00002.M2TS et
00004.M2TS sont pour la 3D
Les chapîtres de
00800.mpls sous TSmuxer sont:
► Afficher le texte
Code : Tout sélectionner
00:00:00.000
00:01:24.375
00:04:39.988
00:08:26.130
00:10:46.771
00:12:52.646
00:16:52.428
00:20:07.748
00:23:38.875
00:26:26.543
00:29:03.366
00:29:37.525
00:34:59.931
00:36:48.622
00:42:59.159
00:45:26.098
00:47:11.620
00:53:33.043
00:56:47.987
01:05:32.052
01:10:19.965
01:14:06.358
01:16:10.690
01:19:59.044
01:22:50.506
01:23:40.056
01:28:21.629
01:29:19.854
01:32:52.274
01:36:59.104
01:44:41.149
01:46:21.041
01:47:58.847
00800.mpls Sous eac3to
► Afficher le texte
Code : Tout sélectionner
CHAPTER01=00:00:00.000
CHAPTER02=00:01:24.376
CHAPTER03=00:04:39.988
CHAPTER04=00:08:26.131
CHAPTER05=00:10:46.771
CHAPTER06=00:12:52.647
CHAPTER07=00:16:52.428
CHAPTER08=00:20:07.748
CHAPTER09=00:23:38.876
CHAPTER10=00:26:26.543
CHAPTER11=00:29:03.367
CHAPTER12=00:29:37.526
CHAPTER13=00:34:59.931
CHAPTER14=00:36:48.623
CHAPTER15=00:42:59.160
CHAPTER16=00:45:26.098
CHAPTER17=00:47:11.620
CHAPTER18=00:53:33.043
CHAPTER19=00:56:47.988
CHAPTER20=01:05:32.053
CHAPTER21=01:10:19.966
CHAPTER22=01:14:06.358
CHAPTER23=01:16:10.691
CHAPTER24=01:19:59.044
CHAPTER25=01:22:50.507
CHAPTER26=01:23:40.056
CHAPTER27=01:28:21.629
CHAPTER28=01:29:19.854
CHAPTER29=01:32:52.275
CHAPTER30=01:36:59.105
CHAPTER31=01:44:41.150
CHAPTER32=01:46:21.041
Les Chapîtes avec le code AutoIt qui sont en rouge ne sont pas présent avec
TSmuxer ni
eac3to
► Afficher le texte
Code : Tout sélectionner
00:00:00.000
[color=#FF0000]00:00:22.272[/color]
00:01:24.376
00:04:39.988
00:08:26.131
00:10:46.771
00:12:52.647
00:16:52.428
00:20:07.748
00:23:38.876
00:26:26.543
00:29:03.367
00:29:37.526
[color=#FF0000]00:31:22.547[/color]
00:34:59.931
00:36:48.623
[color=#FF0000]00:40:03.401[/color]
00:42:59.160
00:45:26.098
00:47:11.620
[color=#FF0000]00:50:13.302[/color]
00:53:33.043
00:56:47.988
[color=#FF0000]01:00:47.227[/color]
01:05:32.053
01:10:19.966
01:14:06.358
01:16:10.691
01:19:59.044
01:22:50.507
01:23:40.056
01:28:21.629
01:29:19.854
01:32:52.275
[color=#FF0000]01:36:13.142[/color]
01:36:59.105
[color=#FF0000]01:40:07.751[/color]
01:44:41.150
01:46:21.041
01:47:58.805
[color=#FF0000]00:00:00.000[/color]
[EDIT] mise à jour des informations sur 00800.mpls
Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : dim. 14 oct. 2012 18:54
par mikell
En effet, le format de la playlist est MPLS0200, il faudrait adapter le code qui est construit pour une playlist MPLS0100
Tout à fait faisable, mais moi je vais arrêter là parce que ça commence à faire trop de boulot et ma famille commence à faire la gueule
Pour continuer, dans mon code précédent ya toutes les bases qu'il te faut concernant lecture, retranscription et conversion des valeurs du fichier
Suffit de t'inspirer de ce code,
ici , apparemment en C# (ou C quelque chose) et de le convertir en autoit
Bon courage

Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : dim. 14 oct. 2012 21:26
par Anthony
OK merci mikell pour tes éfforts et ce défi je vais regarder çà, qui pour moi est du chinoix

Mes éxcuses à ta famille

Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : dim. 14 oct. 2012 23:59
par mikell
Bah elle commence un peu à avoir l'habitude la famille
Blasée quoi
Bon OK en fait pour trier les chapitres il faut juste prendre une ref supplémentaire (et code optimisé en passant)
► Afficher le texte
Code : Tout sélectionner
;#Include <Array.au3>
Global $mfile = "00800.mpls", $info, $n = 82, $ch, $chap[1]
$size = FileGetSize($mfile)
$mpls = FileOpen($mfile, 16)
Global $caract = StringRegExp(FileRead($mpls), '[[:xdigit:]]{2}', 3)
FileClose($mpls)
;_arraydisplay($caract)
$in = _GetZeBin($n)
$info &= "point d'entrée" & @TAB & _Display($in) & @crlf
$out = _GetZeBin($n+4)
$info &= "point de sortie" & @TAB & _Display($out) & @crlf
$duree = $out - $in
$info &= "Durée totale" & @TAB & _Display($duree) & @crlf&@crlf
For $i = $n+8 to $size-4
If _Chapitres($i) Then
$chap[$ch] = _GetZeBin($i-4)
$info &= "Chapitre " & StringFormat("%02i", $ch) & @TAB & _Display($chap[$ch]-$in) & @crlf ;<< rectif /point d'entree
$ch += 1
ReDim $chap[$ch+1]
EndIf
Next
Msgbox(0, $mfile, $info)
;================================================
Func _ReadZeHex($pos, $nb)
Local $char[$nb]
For $i = 0 to $nb-1
$char[$i] = "0x" & $caract[$pos+$i]
Next
Return $char
EndFunc
Func _GetZeBin($pos)
Local $char = _ReadZeHex($pos, 4)
$bin = BitShift($char[0],-24) + BitShift($char[1],-16) + BitShift($char[2],-8) + BitShift($char[3], 0)
Return $bin
EndFunc
Func _Chapitres($pos)
Local $char = _ReadZeHex($pos-8, 12)
Local $backref = StringFormat("%.2X%.2X%.2X%.2X", $char[0], $char[1], $char[2], $char[3])
Local $postref = StringFormat("%.2X%.2X%.2X%.2X", $char[8], $char[9], $char[10], $char[11])
If $postref = "FFFF0000" AND $backref = "00010000" Then
Return 1
Else
Return 0
EndIf
EndFunc
Func _Display($pts)
$sec = $pts/45000
Return StringFormat("%02.0f:%02.0f:%06.3f", Floor($sec/3600), Floor(Mod($sec, 3600)/60), Mod($sec, 60) )
EndFunc
Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : lun. 15 oct. 2012 09:50
par Anthony
Merci la prise en charge MPLS0100 et MPLS0200 et un grand succés et fonctionne à la perféction

Heuuu.. çà m'embète de te demander çà mais la prise en charge de 00003.m2ts etc.. n'est pas prise en charge

Il en découle une durée érronée et chapîtres manquants.
Ce sera beaucoup plus facile de voir avec cette nouvelle playlist.
- 00800.rar
- Nouveau 00800.mpls
- (464 Octets) Téléchargé 187 fois
Chapîtres avec TSmuxer
► Afficher le texte
Code : Tout sélectionner
Durée totale 01:45:49.381
Chapitre 01 00:00:00.000
Chapitre 02 00:06:09.577
Chapitre 03 00:11:27.478
Chapitre 04 00:16:58.809
Chapitre 05 00:22:36.229
Chapitre 06 00:31:24.632
Chapitre 07 00:37:36.420
Chapitre 08 00:42:43.018
Chapitre 09 00:48:55.849
Chapitre 10 00:53:58.234
Chapitre 11 00:59:27.772
Chapitre 12 01:05:52.782
Chapitre 13 01:11:56.311
Chapitre 14 01:19:50.619
Chapitre 15 01:27:57.063
Chapitre 16 01:35:30.683
Et avec le code AutoIt
► Afficher le texte
Code : Tout sélectionner
point d'entrée 00:00:11.651
point de sortie 00:43:16.817
Durée totale 00:43:05.166
Chapitre 01 00:00:00.000
Chapitre 02 00:06:09.578
Chapitre 03 00:11:27.478
Chapitre 04 00:16:58.809
Chapitre 05 00:22:36.230
Chapitre 06 00:31:24.633
Chapitre 07 00:37:36.421
Chapitre 08 00:42:43.019
Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : mar. 16 oct. 2012 13:56
par mikell
Demain je reprends le boulot, faudra te débrouiller pour extraire la durée totale
en attendant amuse-toi avec ça
► Afficher le texte
Code : Tout sélectionner
#Include <Array.au3>
Global $mfile = "00800.mpls", $info, $n = 82, $ch, $chap[1][2], $m2ts[1][5] , $m2, $ps
$size = FileGetSize($mfile)
$mpls = FileOpen($mfile, 16)
Global $caract = StringRegExp(FileRead($mpls), '[[:xdigit:]]{2}', 3)
FileClose($mpls)
;_arraydisplay($caract, "fichier")
For $i = 40 to $size-20
If _M2ts($i)<>0 Then
$m2 += 1
ReDim $m2ts[$m2+1][5]
$res = _M2ts($i)
For $m = 0 to 4
$m2ts[$m2][$m] = $res[$m]
Next
EndIf
Next
$m2ts[0][0] = $m2
;_arraydisplay($m2ts, "durées")
$in = "0x" & $caract[$n] & $caract[$n+1]& $caract[$n+2] & $caract[$n+3]
$info &= "point d'entrée" & @TAB & _Display($in) & @crlf
$chap[0][1] = -1
For $i = $n+8 to $size-4
If _Chapitres($i)<>0 Then
$ch += 1
ReDim $chap[$ch+1][2]
$pos = $i-4
$res1 = _Chapitres($i)
$chap[$ch][0] = $res1[0]
$chap[$ch][1] = $res1[1]
If $chap[$ch][1]<>$chap[$ch-1][1] Then
$info &= @crlf & "------- " & $m2ts[$chap[$ch][1]+1][0] & @crlf
; $info &= "-- point d'entrée " & _Display($ps+$in) & @crlf
$ps += $m2ts[$chap[$ch][1]+1][1]
$info &= "-- point de sortie " & _Display($ps+$in) & @crlf
EndIf
$info &= "Chapitre " & StringFormat("%02i", $ch) & @TAB & _Display($chap[$ch][0]-$in) & @crlf
EndIf
Next
;_arraydisplay($chap, "chapitres")
Msgbox(0, $mfile, $info)
;================================================
Func _M2ts($pos)
Local $array[5]
Local $char[20]
For $i = 0 to 19
$char[$i] = "0x" & $caract[$pos+$i]
Next
Local $ext = StringFormat("%.2X%.2X%.2X%.2X", $char[5], $char[6], $char[7], $char[8])
If $ext = "4D325453" Then
$nbr = Chr($char[0]) & Chr($char[1])& Chr($char[2]) & Chr($char[3]) & Chr($char[4])
$in1 = "0x" & StringFormat("%.2X%.2X%.2X%.2X", $char[12], $char[13], $char[14], $char[15])
$out1 = "0x" & StringFormat("%.2X%.2X%.2X%.2X", $char[16], $char[17], $char[18], $char[19])
$dur1 = $out1-$in1
$array[0] = $nbr & ".m2ts"
$array[1] = $dur1
$array[2] = _Display($dur1)
$array[3] = _Display($in1)
$array[4] = _Display($out1)
If Mod($nbr, 2) = 0 Then Return $array
Else
Return 0
EndIf
EndFunc
Func _Chapitres($pos)
Local $char[12], $add, $array[2]
For $i = 0 to 11
$char[$i] = "0x" & $caract[$pos-8+$i]
Next
Local $postref = StringFormat("%.2X%.2X%.2X%.2X", $char[8], $char[9], $char[10], $char[11])
If $postref = "FFFF0000" Then
Local $backref = StringFormat("%.2X%.2X%.2X%.2X", $char[0], $char[1], $char[2], $char[3])
For $i = 0 to $m2ts[0][0]
If $backref = "0001000" & $i Then
For $j = 1 to $i
$add += $m2ts[$j][1]
Next
Local $ref = "0x" & StringFormat("%.2X%.2X%.2X%.2X", $char[4], $char[5], $char[6], $char[7])
$array[0] = $ref + $add
$array[1] = $i
Return $array
EndIf
Next
Else
Return 0
EndIf
EndFunc
Func _Display($pts)
$sec = $pts/45000
Return StringFormat("%02.0f:%02.0f:%06.3f", Floor($sec/3600), Floor(Mod($sec, 3600)/60), Mod($sec, 60) )
EndFunc
Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : mar. 16 oct. 2012 15:55
par Anthony
Yeah génial et encore merci, je verai çà quand j'aurai un peu de temps

Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : sam. 10 nov. 2012 06:07
par Anthony
Re, depuis longtemps
Voilà je n'arrive pas à mettre
Total m2ts à la fin de chaque fichier m2ts, il passe en deuxième ligne, avez-vous une idée de comment le résoudre ?
Je pense qu'en repartant sur ce code je résoudrai 2 topic
Merci d'avance
En pièce jointe un mpls à mettre dans le même dossier que le code au3
Code:
► Afficher le texte
Code : Tout sélectionner
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.6.1
From idea of: Web Free Software
Author: mikell
Script Function:
_Include_MPLSs_+_Extract_Chapters_List.au3
#ce ----------------------------------------------------------------------------
; analyse de fichier playlist *.mpls
#Include <Array.au3>
#include <File.au3>
_Get_All_MPLSs()
; ==> _Get_All_MPLSs() ===============================================
Func _Get_All_MPLSs()
;$SourcePath = "F:\BDMV\PLAYLIST\"
$SourcePath = ".\"
Local $FileList = _FileListToArray($SourcePath,'*.mpls', 1)
$MPLSsCount = UBound($FileList)-1
_ArraySort($FileList)
For $i = 0 to UBound($FileList)-2
Global $mfile = $SourcePath&$FileList[$i]
_Extract_Chapters_List()
Next
If @error = 1 Or @error = 4 Then
MsgBox(0, "", "No Folders or MPLS Files Found.")
Else
;MsgBox(0, "", "Done.")
EndIf
EndFunc ; ==> _Get_All_MPLSs()
; <== _Get_All_MPLSs() ===================================================
; ==> _Extract_Chapters_List() ===========================================
Func _Extract_Chapters_List()
$info = ""
$ch = ""
$m2 = ""
$ps = ""
Global $info, $n = 82, $ch, $chap[1][2], $m2ts[1][3] , $m2, $ps, $dureeM2TS
$size = FileGetSize($mfile)
$mpls = FileOpen($mfile, 16)
Global $caract = StringRegExp(FileRead($mpls), '[[:xdigit:]]{2}', 3)
FileClose($mpls)
;_arraydisplay($caract, "fichier")
For $i = 40 to $size-20
If _M2ts($i)<>0 Then
$m2 += 1
ReDim $m2ts[$m2+1][3]
$res = _M2ts($i)
$m2ts[$m2][0] = $res[0][0]
$m2ts[$m2][1] = $res[0][1]
$m2ts[$m2][2] = $res[0][2]
EndIf
Next
$m2ts[0][0] = $m2
;_arraydisplay($m2ts, "durées")
$in = _GetZeBin($n)
;$info &= "point d'entrée" & @TAB & _Display($in) & @crlf
$chap[0][1] = -1
For $i = $n+8 to $size-4
If _Chapitres($i)<>0 Then
$ch += 1
ReDim $chap[$ch+1][2]
$pos = $i-4
$res1 = _Chapitres($i)
$chap[$ch][0] = $res1[0][0]
$chap[$ch][1] = $res1[0][1]
If $chap[$ch][1]<>$chap[$ch-1][1] Then
$ps += $m2ts[$chap[$ch][1]+1][1]
$start = _Display($in)
$end = _Display($ps+$in)
$dureeM2TS = _Display(($ps+$in)-$in)
$m2tsFile = $m2ts[$chap[$ch][1]+1][0]
$info &= $m2tsFile & @CRLF
;$info &= "point d'entrée" & @TAB & $start & @CRLF
;$info &= "point de sortie " & @TAB & $end & @CRLF & @CRLF
;$info &= "Durée totale" & @TAB & $duree & @CRLF & @CRLF
Else
$m2tsFile = ""
EndIf
$info &= @TAB & "Chapitre " & StringFormat("%02i", $ch) & @TAB & _Display($chap[$ch][0]-$in) & @CRLF
If $m2tsFile Then
$info &= @TAB & "Total m2ts" & @TAB & $dureeM2TS & @CRLF
EndIf
EndIf
Next
;_arraydisplay($chap, "chapitres")
Msgbox(0, $mfile, $info)
EndFunc
;================================================
Func _M2ts($pos)
Local $array[1][3], $char[20]
For $i = 0 to 19
$char[$i] = "0x" & $caract[$pos+$i]
Next
Local $ext = StringFormat("%.2X%.2X%.2X%.2X", $char[5], $char[6], $char[7], $char[8])
If $ext = "4D325453" Then
$nbr = Chr($char[0]) & Chr($char[1])& Chr($char[2]) & Chr($char[3]) & Chr($char[4])
$in1 = "0x" & StringFormat("%.2X%.2X%.2X%.2X", $char[12], $char[13], $char[14], $char[15])
$out1 = "0x" & StringFormat("%.2X%.2X%.2X%.2X", $char[16], $char[17], $char[18], $char[19])
$dur1 = $out1-$in1
$array[0][0] = $nbr & ".m2ts" ; m2ts 2D & 3D
$array[0][1] = $dur1
$array[0][2] = _Display($dur1)
Return $array
Else
Return 0
EndIf
EndFunc
Func _GetZeBin($pos)
$bin = "0x" & $caract[$pos] & $caract[$pos+1]& $caract[$pos+2] & $caract[$pos+3]
Return $bin
EndFunc
Func _Chapitres($pos)
Local $char[12], $add, $array[1][2]
For $i = 0 to 11
$char[$i] = "0x" & $caract[$pos-8+$i]
Next
Local $postref = StringFormat("%.2X%.2X%.2X%.2X", $char[8], $char[9], $char[10], $char[11])
If $postref = "FFFF0000" Then
Local $backref = StringFormat("%.2X%.2X%.2X%.2X", $char[0], $char[1], $char[2], $char[3])
Local $ref = "0x" & StringFormat("%.2X%.2X%.2X%.2X", $char[4], $char[5], $char[6], $char[7])
For $i = 0 to $m2ts[0][0]
If $backref = "0001000" & $i Then
For $j = 1 to $i
$add += $m2ts[$j][1]
Next
$array[0][0] = $ref + $add
$array[0][1] = $i
Return $array
EndIf
Next
Else
Return 0
EndIf
EndFunc
Func _Display($pts)
$sec = $pts/45000
Return StringFormat("%02.0f:%02.0f:%06.3f", Floor($sec/3600), Floor(Mod($sec, 3600)/60), Mod($sec, 60) )
EndFunc
- 00003.rar
- 00003.mpls
- (521 Octets) Téléchargé 145 fois
Re: [..] Extraire les chapîtres d'une playlist AVCHD
Posté : sam. 10 nov. 2012 09:40
par mikell
Alors là t'as vraiment pas réfléchi

suffit évidemment de faire ça en dehors de la boucle For qui liste les chapitres (de suite après)
Je te mets juste la partie concernée
Code : Tout sélectionner
.....
Else
$m2tsFile = ""
EndIf
$info &= @TAB & "Chapitre " & StringFormat("%02i", $ch) & @TAB & _Display($chap[$ch][0]-$in) & @CRLF
EndIf
Next
[color=#BF0000]; là on est sorti de la boucle For ^^[/color]
$info &= @TAB & "Total m2ts" & @TAB & $dureeM2TS & @CRLF
Msgbox(0, $mfile, $info)
EndFunc
J'imagine que maintenant tu vas pouvoir mettre un [R]
NB : puisque tu es toujours là-dedans, si ça t'intéresse je peux te filer les 2 outils que je m'étais faits à l'époque pour résoudre le pb précédent :
- un convertisseur temps-hexa (exemple: 0F 5E F2 9F <=> 01:35:30.683 )
- un pour faire addition-soustraction de 2 temps au format hh:mm:ss:xxx