我在使用时遇到了令人沮丧的困难:
projectItem.setInPoint(seconds)
projectItem.setOutPoint(seconds)…大约50%的时间,I/O点(在源窗口中)设置为1帧误差(有时为2帧外)。我觉得我已经尝试了所有的方法来发现模式是什么,但它似乎完全是随机的。
我认为这可能与丢帧,可变帧率,剪辑与序列不同,或其他奇怪之处有关,但错误发生在简单的恒定帧率,如25fps。这些错误似乎没有韵律或原因(尽管相同的错误在某些帧上总是发生)。
子剪辑还有一个更大的问题,因为脚本环境认为所有子剪辑都从第0帧开始。
我已经尝试了所有方法,包括在刻度、秒或帧中工作,以及在它们之间进行转换。什么都不会有不同。
我试图完成的是在一组剪辑上设置输入/输出,运行脚本从这些源剪辑进行较小的剪切,然后将剪辑恢复到原始I/O点。除了我不能用这个bug将所有的剪辑恢复到原来的I/O点之外,我已经完成了大部分的工作。
下面是我写的一个测试脚本。它获取当前的I/O位置,存储它们,然后将它们设置回相同的剪辑。一半的时间,这些值是不同的!*这使得不可能准确地设置剪辑I/O。
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;发布于 2020-02-11 00:50:19
我做了更多的测试。虽然我不太了解错误的来源,但我相信我已经找到了解决它的方法。
我测试了两个slug,每个10秒长,具有不同的帧速率,并通过循环运行它们,并设置每个帧的IO点。我检查了每一帧,看看哪些帧返回错误。我发现的是:
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);发布于 2020-10-20 23:02:51
我的观察结果是:
(我们在设置标记时会遇到问题。)
我们的计算是正确的,但是Premiere将标记秒数设置为8.35999999999606而不是8.36 ( 25fps),标记显示为8秒9帧,但显示值是8秒8帧。
他们建议使用epsilon来检查某个值是否非常接近计算值。在本例中,差值为0,00000000000394,这是一个非常低的值,应将其更正为0。
我不想知道如果我们使用帧速率和dropframes (例如23.976)会发生什么。
编辑:在我的例子中,你必须纠正现有标记中的时间,所以这不起作用。我会试着添加半帧...
https://stackoverflow.com/questions/59995738
复制相似问题