我想定位一个QuickTime电影包含一个时间码轨道到用户定义的TC位置。我很清楚整个时间刻度,时间值的东西,但我不知道我错过了什么,希望你们能给我一个提示!!
我想给你一个固定值的例子,以便于解释:
该电影具有NTSC帧率,即29.97 fps,并且是非dropframe。电影直接从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时间刻度范围。
两种方法都不起作用…当我使用setCurrentTime
将QTTimeDecrement
计算的绝对值设置为剪辑时,我总是在我想要的其他地方....
你的方向是对的。您需要计算时间偏移量并将其转换为QTTime
。QTMovie的时间是从零开始的
NSTimeInterval timeInterval = timeOffset;
[_movie setCurrentTime:QTMakeTime((long long)(timeInterval * (double)movieTimeScale), movieTimeScale)];
movieTimeScale
通常可以是常量,如600
。或者你也可以从电影中获取:
long movieTimeScale = [_movie currentTime].timeScale;
只是想填补缺失的信息。
从电影开始我就计算了绝对帧数。因此,输入的时间码和第一帧电影的时间码的偏移量。
从电影的TC轨道中,我从电影中获得时间码媒体处理程序。然后我可以得到一个TimeCodeDef结构。这个结构有一个名为frameDuration的字段,这是需要与绝对帧值相乘的值。
定位到所有的时间码位置,现在使用:
[movie setCurrentTime:QTMakeTime(absoluteNumFrames * tcDef.frameDuration, timeScale )];