Я использую этот скрипт, чтобы превратить кадры в тайм-код. Почему я получаю 00:30:00:00
как результат при использовании 43156.8
как ценность, но 00:29:59:23
при передаче точно такого же значения, как переменная?
function framesToTC($frames, $framerate) {
$hours = floor( $frames / ( $framerate * 60 * 60 ) );
$framesleft = $frames - ($hours * $framerate * 60 * 60);
$minutes = floor( $framesleft / ( $framerate * 60 ) );
$framesleft -= ( $minutes * $framerate * 60 );
$seconds = floor( $framesleft / ( $framerate ) );
$framesleft -= ( $seconds * $framerate );
$tc = sprintf("%02d:%02d:%02d:%02d", $hours, $minutes, $seconds, $framesleft );
return $tc;
}
$frames = 86400000/48000*23.976; //43156.8
echo framesToTC($frames, 23.976) . '<br />'; //00:29:59:23
echo framesToTC(43156.8, 23.976); //00:30:00:00
Я взорвал твою функцию (когда сомневаешься распечатать, это мой девиз)
<?php
function framesToTC($frames, $framerate) {
echo "\n".str_pad(" START ", 40, "=", STR_PAD_BOTH)."\n";
echo "frames: {$frames}\n";
echo "framerate: {$framerate}\n";
$hours = floor( $frames / ( $framerate * 60 * 60 ) );
echo "hours: {$hours}\n";
$framesleft = $frames - ($hours * $framerate * 60 * 60);
echo "framesleft: {$framesleft}\n";
$x = $framesleft / ( $framerate * 60 );
echo "x: {$x}\n";
echo str_pad(" DEVIATION ", 40, "-", STR_PAD_BOTH)."\n";
$minutes = floor( $x );
echo "minute: {$minutes}\n";
$framesleft -= ( $minutes * $framerate * 60 );
echo "framesleft: {$framesleft}\n";
$seconds = floor( $framesleft / ( $framerate ) );
echo "seconds: {$seconds}\n";
$framesleft -= ( $seconds * $framerate );
echo "framesleft: {$framesleft}\n";
$tc = sprintf("%02d:%02d:%02d:%02d", $hours, $minutes, $seconds, $framesleft );
echo "tc: {$tc}\n";
return $tc;
}
$frames = (86400000/48000*23.976); //43156.8
echo framesToTC($frames, 23.976) . "\n"; //00:29:59:23
echo framesToTC(43156.8, 23.976); //00:30:00:00
$frames = (86400000/48000*23.976); //43156.8
echo framesToTC($frames, 23.976) . "\n"; //00:29:59:23
echo framesToTC(43156.8, 23.976); //00:30:00:00
Выходы
================ START =================
frames: 43156.8
framerate: 23.976
hours: 0
framesleft: 43156.8
x: 30
-------------- DEVIATION ---------------
minute: 29
framesleft: 1438.56
seconds: 59
framesleft: 23.975999999998
tc: 00:29:59:23
00:29:59:23
================ START =================
frames: 43156.8
framerate: 23.976
hours: 0
framesleft: 43156.8
x: 30
-------------- DEVIATION ---------------
minute: 30
framesleft: 7.2759576141834E-12
seconds: 0
framesleft: 7.2759576141834E-12
tc: 00:30:00:00
00:30:00:00
Смотрите это здесь.
http://sandbox.onlinephpfunctions.com/code/918f5187e5dbab3f03812112a54f6b57754f5e7e
Вы можете «исправить», что я использую слово свободно, округляя $framesleft
перед этим. Вот
echo "framesleft: {$framesleft}\n";
$framesleft = floor($framesleft);
$x = $framesleft / ( $framerate * 60 );
Выходы
================ START =================
frames: 43156.8
framerate: 23.976
hours: 0
framesleft: 43156.8
x: 29.999443888333
-------------- DEVIATION ---------------
minute: 29
framesleft: 1437.76
seconds: 59
framesleft: 23.176000000002
tc: 00:29:59:23
00:29:59:23
================ START =================
frames: 43156.8
framerate: 23.976
hours: 0
framesleft: 43156.8
x: 29.999443888333
-------------- DEVIATION ---------------
minute: 29
framesleft: 1437.76
seconds: 59
framesleft: 23.176000000002
tc: 00:29:59:23
00:29:59:23
Проверьте это здесь
http://sandbox.onlinephpfunctions.com/code/c78037e52d97ff50094cbc3b045309d155a302fa
Я предполагаю, что это как-то связано с точностью поплавка, но это выше моей зарплаты. Но, по крайней мере, это избавляет от отклонения в этом случае. Возможно, вам придется использовать ceil
или же round
Я не знаю, каким должен быть правильный ответ. Я просто тыкаю в вещи и говорю, что они работают или ломаются до конца … LOL
Других решений пока нет …