【问题标题】:QTTime to position a movie to a certain timecodeQTTime 将电影定位到某个时间码
【发布时间】:2012-02-01 23:50:28
【问题描述】:

我想将包含时间码轨道的 QuickTime 电影定位到用户定义的 TC 位置。 我很清楚整个 timeScale,timeValue 的东西,但我不知道我错过了什么,希望你们能在这里给我一个提示!

我想给你一个固定值的例子,以便于解释:

影片具有 NTSC 帧速率,即 29.97 fps 且无丢帧。电影直接从00:59:58:00 开始。用户输入 TC 位置01:00:00:10,我想定位到那个确切的位置。

QTMovie 的唯一选择是 setCurrentTime(QTTime time) 函数,我知道时间必须是从电影开始的“单位”的绝对值。

所以,我需要先计算偏移量。为此,我需要先使用QTTimeFromString 函数将两个时间码转换为QTTime 结构。

这就是我的问题开始的地方! QTTimeFromString 函数需要"days:hours:minutes:seconds.timeValue/timescale" 格式的字符串

我为 timeValue 使用哪个值?我读到了一些关于frames * 100 的内容,我自己想到了通过乘以帧值将帧值“映射”到 2997 时间刻度范围内。

两种方法都行不通...当我使用setCurrentTimeQTTimeDecrement 计算的绝对值设置为剪辑时,我总是在我想去的其他地方...。

我不知道我做错了什么,我希望你们能帮助我!! 提前致谢

【问题讨论】:

    标签: cocoa quicktime qtkit


    【解决方案1】:

    你正朝着正确的方向前进。您需要计算时间偏移并将其转换为QTTime。 QTMovie 的时间是从零开始的。

    NSTimeInterval timeInterval = timeOffset;
    
    [_movie setCurrentTime:QTMakeTime((long long)(timeInterval * (double)movieTimeScale), movieTimeScale)];
    

    movieTimeScale 通常可以是一个常量,例如600。或者,您可以从电影中获得它:

    long movieTimeScale = [_movie currentTime].timeScale;
    

    帧速率在这里无关紧要。

    【讨论】:

    • 嘿戴维德。好的。将检查它。在您上面的代码中,timeOffset? 是什么?理解,帧速率无关紧要,问题只是我从 MIDI 接口获取格式为 hh:mm:ss.ff 的值,我需要使用它。所以我需要一种在这两者之间进行转换的方法。有任何想法吗??提前致谢!
    • 将值转换为秒:NSTimeInterval timeOffset = (NSTimeInterval)hh * 3600.0 + (NSTimeInterval)mm * 60.0 + (NSTimeInterval)ss + (NSTimeInterval)ff;
    • ff 是在上述 29.97 fps 情况下的 0 - 29 范围内的值。我不认为我可以使用你的“公式”来实现正确的转换,你不觉得吗?我可以将ff 写成一个分数,所以对于 10 帧,例如ff = 10 / 29.97; 会尝试并回复您。谢谢你的帮助!!
    • 当然,你需要将帧数转换为秒数,所以你一个权利,除以每秒的帧数。
    • 嘿,大卫,我又来了。我试过了,但没有用。尽管这些值已经非常接近,但它们仍然在漂移。意味着如果我在某个时间码地址上,然后我使用该功能定位到那个确切的时间,电影总是向后退几帧。我越深入电影,偏移帧的数量就越多。我已经尝试了几个小时......我希望你能给我一个提示如何使用帧和时间尺度。提前致谢!
    【解决方案2】:

    只是想补充缺失的信息。

    我实际上计算了自电影开始以来的绝对帧数。 因此,传入的时间码和第一部电影帧的时间码的偏移量。

    从电影的 TC 轨道,我得到了电影的时间码媒体处理程序。 然后我可以得到一个 TimeCodeDef 结构。 这个结构有一个叫做 frameDuration 的字段,这是绝对帧值需要乘以的值。

    现在可以完美定位到所有时间码位置:

    [movie setCurrentTime:QTMakeTime(absoluteNumFrames * tcDef.frameDuration, timeScale )];
    

    【讨论】:

    • 嘿@guitarflow。你介意提供更多关于你所做的事情的信息吗?我需要弄清楚 Quicktime 的时间码,并且我开始意识到应用程序需要在 32 位下才能运行。你是如何解决你的问题的?过去几天我一直在疯狂地试图从快速时间中获得一个简单的时间码轨道。
    • 您需要使用旧的 QT API,它不能在 64 位中运行。也许您应该尝试看看 AVFoundation 提供什么。 QuickTime 已有 20 年历史,因此它无法在 64 位中运行是可以理解的。它实际上很吸引人,它仍然运行良好!
    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多