Расчет длительности последовательности Final Cut Pro X xml
Элементы Final Cut Pro X xml (документация fcpxml, стр. 19) имеют атрибуты длительности, подобные этим "duration=264100/2400s". Денумератор должен означать частоту кадров (24 кадра в секунду). Как рассчитать длительность элемента в кадрах или в секундах и кадрах?
Выдержка из документации: "Значения времени выражаются как рациональное количество секунд с 64-разрядным числителем и 32-разрядным знаменателем. Частоты кадров для NTSC-совместимых носителей, например, используют длительность кадра 1001/30000 с (29,97 кадров в секунду)) или 1001/60000 с (59,94 кадра в секунду). Если значение времени равно целому числу секунд, доля может быть уменьшена до целых секунд (например, 5 с)."
редактировать: на самом деле продолжительность так очевидна... например. длительность ="4500/2400 с": 4500 // 2400 - 1 секунда; 4500 % 2400 - это 2100 или 21 кадр, то есть продолжительность составляет 00: 00: 01: 21.
но все же я не могу выяснить, как рассчитать временной код элемента во временной шкале со всеми этими другими атрибутами, как это (заголовок начинается в 00: 00: 04: 22 на временной шкале, продолжительность временной шкалы составляет 00: 01: 50: 11, все @24fps):
<title name="Basic Title: The Big Lebowski" lane="1" offset="8651800/2400s" ref="r2" duration="6000/2400s" start="3600s">
1 ответ
Я не уверен, что понимаю ваш вопрос, но из вашего примера я получаю следующее:
- Сроки начинается
01:00:00:00
- Название появляется в
01:00:04:22
- И остается в течение
00:00:02:12
(60 кадров при 24 кадрах в секунду)
Я получил эти результаты из следующей функции Perl, которая принимает частоту кадров в качестве второго аргумента.
sub fcptime2tc {
my ($t, $fps) = @_;
# extract $x, $y from stuff like "8651800/2400s" or "3600s"
my ($x, $y) = $t =~ m!^(\d+)(/\d+)s$!;
$y =~ s!^/!!; # delete "/"
$y ||= 1;
my $seconds = $x / $y;
my $f = sprintf( "%02.0f", ( $seconds - int($seconds) ) * $fps );
my $z = int($seconds);
my $s = sprintf( "%02d", $z % 60 ); $z /= 60;
my $m = sprintf( "%02d", $z % 60 ); $z /= 60;
my $h = sprintf( "%02d", $z % 24 );
return join(":", $h, $m, $s, $f);
}
Переводить на любой другой язык, если хотите, тривиально.
То, что это не принимает во внимание, - глупые временные коды.