Ошибка скриптинга, когда setInPoint и setOutPoint в Adobe Premiere? - PullRequest
0 голосов
/ 31 января 2020

Я столкнулся с разочаровывающей кирпичной стеной при использовании:

projectItem.setInPoint(seconds)
projectItem.setOutPoint(seconds)

… примерно в 50% случаев, когда точки ввода / вывода (в окне источника) устанавливаются с ошибкой в ​​1 кадр ( иногда 2 кадра). Мне кажется, что я попробовал все, чтобы узнать, что такое паттерн, но он кажется совершенно случайным.

Я подумал, что это может быть связано с пропуском кадров, переменной частотой кадров, клипом отличается от последовательности или другие странности, но ошибка возникает при простых постоянных частотах кадров, таких как 25 кадров в секунду. Похоже, что в этих ошибках нет ни рифмы, ни причины (хотя одна и та же ошибка возникает постоянно в определенных кадрах).

Существует еще большая проблема с субклипами, поскольку среда сценариев считает, что все субклипы начинаются с кадра 0 .

Я перепробовал все, включая работу в тиках, секундах или кадрах и конвертирование между ними. Ничего не изменило.

То, что я пытаюсь сделать sh, - это установить / удалить набор клипов, запустить сценарий, чтобы сделать меньшие фрагменты из этих исходных клипов, а затем восстановить клипы. к исходным точкам ввода / вывода. Получил большую часть этой работы, за исключением того, что я не могу восстановить все клипы к исходным точкам ввода / вывода с помощью этой ошибки.

Ниже приведен тестовый скрипт, который я написал. Он получает текущие позиции ввода / вывода, сохраняет их, а затем устанавливает их обратно в тот же клип. В половине случаев значения не совпадают! Argh! Это делает невозможным точную настройку ввода / вывода клипов.

function framesToSeconds (frames, fps)
{
    return frames / fps;
}

function secondsToFrames (sec, fps)
{
    return sec * fps;
}

/*---------------------------------------------------*/

var projItems = app.project.rootItem.children;
var clip = projItems[2];
var fps = clip.getFootageInterpretation().frameRate;

var setIn = clip.getInPoint().seconds;
var setOut = clip.getOutPoint().seconds;

var inFrame = secondsToFrames (setIn, fps);
var outFrame = secondsToFrames (setOut, fps);

var secIn = framesToSeconds (inFrame, fps);
var secOut = framesToSeconds (outFrame, fps);

clip.setInPoint( secIn );
clip.setOutPoint( secOut );

var setIn = clip.getInPoint().seconds;
var setOut = clip.getOutPoint().seconds;

1 Ответ

0 голосов
/ 10 февраля 2020

Я сделал еще несколько испытаний. Хотя я не совсем понимаю источник ошибки, я думаю, что нашел решение для нее.

Я протестировал 2 слагов, каждый длиной 10 секунд, с разной частотой кадров, пропустил их через al oop и установил точки ввода / вывода для каждого кадра. Я проверил каждый кадр, чтобы увидеть, какие кадры вернулись не так. Я обнаружил:

test_25fps_1280x720.mov: ошибка в кадрах 211,209,207,205,203,201

test_29fps_1024x576.mov: ошибка в кадрах 251,244,242,122,121,61

Эти ошибки не случайно Всякий раз, когда я пытался установить точку входа или выхода в этих кадрах, ВСЕГДА бы округлять 1 кадр (я ошибался, когда отключалось около 50% кадров, на самом деле это менее 3%).

Мой лучший предположение состоит в том, что есть некоторая погрешность точности, потому что где-то происходит вычисление с использованием больших чисел с плавающей точкой. Я не могу подтвердить это, и при этом я не понимаю, как это исправить. Но я понял, что смогу проверить точки входа и выхода после их установки, и, если они не соответствуют ожиданиям, я могу сбросить точку, добавив продолжительность в половину кадра (в секундах). Полный кадр просто повторяет ошибку, но половина кадра заставит Premiere округлить до правильного кадра.

Это основная часть моего кода:

/*---------------------------------------------------*/
function fixAnyFrameErrors (clip, inFrame, outFrame, fps, halfFrame)
/*---------------------------------------------------*/
{
    var inSecSet    = clip.getInPoint().seconds;
    var inFrameSet  = secondsToFrames (inSecSet, fps);
    var outSecSet   = clip.getOutPoint().seconds;
    var outFrameSet = secondsToFrames (outSecSet, fps);

    if ( parseFloat(inFrame) != parseFloat(inFrameSet) ) {
        clip.setInPoint( secIn + halfFrame );
    }

    if ( parseFloat(outFrame) != parseFloat(outFrameSet) ) {
        clip.setOutPoint( secOut + halfFrame );
    }
}

/*---------------------------------------------------*/

var tps = 254016000000; // 2.54016e11 ticks per second (Premiere Pro constant)

var projItems = app.project.rootItem.children;
var clip = projItems[2];
clip.addMetadata();
var fps = clip.getFootageInterpretation().frameRate;
var tpf = clip.videoInPoint.frame_rate;
var frameDuration = tpf / tps; // in seconds
var halfFrame = (frameDuration * 0.5);

var inFrame = 201;
var outFrame = 211;

var secIn  = framesToSeconds (inFrame,  fps);
var secOut = framesToSeconds (outFrame, fps);

clip.setInPoint ( secIn  );
clip.setOutPoint( secOut );

fixAnyFrameErrors (clip, inFrame, outFrame, fps, halfFrame);
...