2017-08-29 2 views
1

私はバイナリを学び、Matroskaに基づいてPHPで簡単なWebMパーサーを作成しようとしています。バイナリWebMファイルからフロートを読み取る方法は?

私はunpack(format, data)でTimecodeScale、MuxingAppm WritingAppなどを読みました。私の問題はDuration(0x4489)がSegment Information(0x1549a966)に達したときですfloatを読んで、TimecodeScaleに基づいてそれを秒に変換しなければなりません:261.564s-> 00:04:21.564と私はどのようにわかりません。

これは、サンプル・シーケンスです:

`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:*; ]{...} 

私は(0x4489)の後にフロートを読み、261.564sを返す必要があります。

答えて

1

持続時間は、IEEE 754形式で表される倍精度浮動小数点値(64ビット)です。変換の仕方を確認したい場合は、thisをチェックしてください。

TimecodeScaleは、ナノ秒単位のタイムスタンプスケールです。

あなたが行うことができます php

$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"; 

結果:

duration=261.564s 
+0

たTHX @aergistalは、それは私がまさに必要だ、あなたは(私はあなたから多くのことを学びました)私の一日保存しました – jvambio

関連する問題