首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Adobe Premiere中使用setInPoint和setOutPoint时出现脚本错误?

在Adobe Premiere中使用setInPoint和setOutPoint时出现脚本错误?
EN

Stack Overflow用户
提问于 2020-01-31 06:57:18
回答 2查看 402关注 0票数 1

我在使用时遇到了令人沮丧的困难:

代码语言:javascript
复制
projectItem.setInPoint(seconds)
projectItem.setOutPoint(seconds)

…大约50%的时间,I/O点(在源窗口中)设置为1帧误差(有时为2帧外)。我觉得我已经尝试了所有的方法来发现模式是什么,但它似乎完全是随机的。

我认为这可能与丢帧,可变帧率,剪辑与序列不同,或其他奇怪之处有关,但错误发生在简单的恒定帧率,如25fps。这些错误似乎没有韵律或原因(尽管相同的错误在某些帧上总是发生)。

子剪辑还有一个更大的问题,因为脚本环境认为所有子剪辑都从第0帧开始。

我已经尝试了所有方法,包括在刻度、秒或帧中工作,以及在它们之间进行转换。什么都不会有不同。

我试图完成的是在一组剪辑上设置输入/输出,运行脚本从这些源剪辑进行较小的剪切,然后将剪辑恢复到原始I/O点。除了我不能用这个bug将所有的剪辑恢复到原来的I/O点之外,我已经完成了大部分的工作。

下面是我写的一个测试脚本。它获取当前的I/O位置,存储它们,然后将它们设置回相同的剪辑。一半的时间,这些值是不同的!*这使得不可能准确地设置剪辑I/O。

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

发布于 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四舍五入到正确的帧。

这是我的代码的主要部分:

代码语言:javascript
复制
/*---------------------------------------------------*/
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);
票数 1
EN

Stack Overflow用户

发布于 2020-10-20 23:02:51

我的观察结果是:

(我们在设置标记时会遇到问题。)

我们的计算是正确的,但是Premiere将标记秒数设置为8.35999999999606而不是8.36 ( 25fps),标记显示为8秒9帧,但显示值是8秒8帧。

来自Adobe论坛:https://community.adobe.com/t5/premiere-pro/clip-marker-different-start-end-time-in-seconds/m-p/9309128?page=1

他们建议使用epsilon来检查某个值是否非常接近计算值。在本例中,差值为0,00000000000394,这是一个非常低的值,应将其更正为0。

我不想知道如果我们使用帧速率和dropframes (例如23.976)会发生什么。

编辑:在我的例子中,你必须纠正现有标记中的时间,所以这不起作用。我会试着添加半帧...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59995738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档