Я сделал еще несколько испытаний. Хотя я не совсем понимаю источник ошибки, я думаю, что нашел решение для нее.
Я протестировал 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);