2017-08-29 6 views
1

J'essaie d'apprendre binaire et de créer un simple analyseur WebM en PHP basé sur Matroska. Je lis TimecodeScale, MuxingAppm WritingApp, etc. avec unpack(format, data). Mon problème est quand j'atteins Duration (0x4489) dans Segment Information (0x1549a966) Je dois lire un float et basé sur TimecodeScale le convertir en secondes: 261.564s-> 00: 04: 21.564 et je ne sais pas comment.Comment lire un flottant à partir d'un fichier WebM binaire?

C'est une séquence d'échantillons:

`2A D7 B1 83 0F 42 40 4D 80 86 67 6F 6F 67 6C 65 57 41 86 67 6F 6F 67 6C 65 44 89 88 41 0F ED E0 00 00 00 00 16 54 AE 6B` 

TimecodeScale := 2ad7b1 uint [ def:1000000; ] 

MuxingApp := 4d80 string; ("google") 

WritingApp := 5741 string; ("google") 

Duration := 4489 float [ range:>0.0; ] 

Tracks := 1654ae6b container [ card:*; ]{...} 

je dois lire un flotteur après (0x4489) et retour 261.564s.

Répondre

1

La durée est une valeur à virgule flottante double précision (64 bits) représentée au format IEEE 754. Si vous voulez voir comment la conversion est effectuée, vérifiez this.

Le TimecodeScale est l'échelle d'horodatage en nanosecondes.

En php vous pouvez faire:

$bin = hex2bin('410fede000000000'); 
$timecode_scale = 1e6; 

// endianness 
if (unpack('S', "\xff\x00")[1] === 0xff) { 
    $bytes = unpack('C8', $bin); 
    $bytes = array_reverse($bytes); 
    $bin = implode('', array_map('chr', $bytes)); 
} 

$duration = unpack('d', $bin)[1]; 
$duration_s = $duration * $timecode_scale/1e9; 

echo "duration=${duration_s}s\n"; 

Résultat:

duration=261.564s 
+0

Thx @aergistal, c'est exactement ce que je avais besoin, vous avez sauvé ma journée (j'ai appris beaucoup de choses de vous) – jvambio