QTTime для позиционирования фильма по определенному временному коду - PullRequest
0 голосов
/ 05 декабря 2011

Я хочу расположить фильм QuickTime, содержащий дорожку временного кода, в заданную пользователем позицию TC. Я хорошо осведомлен обо всем, что связано с TimeScale, timeValue, но я не знаю, чего мне не хватает, и надеюсь, что вы, ребята, можете подсказать мне здесь !!

Я хочу привести вам пример с фиксированными значениями, чтобы было легче объяснить:

Фильм имеет частоту кадров NTSC, которая составляет 29,97 кадров в секунду, и не поддерживается в кадре. Фильм начинается в 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 путем умножения значения кадра.

Ни один из способов не работает ... когда я устанавливаю абсолютное значение, рассчитанное с помощью QTTimeDecrement, для клипа, используя setCurrentTime Я всегда где-то еще, где я хочу быть ....

Я не знаю, что я делаю неправильно, и я надеюсь, что вы, ребята, можете мне помочь !! Заранее спасибо

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Просто хотел восполнить недостающую информацию.

Я практически рассчитал абсолютное количество кадров с начала фильма. Итак, смещение входящего временного кода и временного кода первого кадра фильма.

Из дорожки TC, которую имеет фильм, я получаю обработчик мультимедиа временного кода из фильма. Затем я могу получить структуру TimeCodeDef. Эта структура имеет поле с именем frameDuration, и это значение, на которое необходимо умножить абсолютное значение кадра.

Теперь можно найти все позиции тайм-кода, используя:

[movie setCurrentTime:QTMakeTime(absoluteNumFrames * tcDef.frameDuration, timeScale )];
1 голос
/ 12 декабря 2011

Вы идете в правильном направлении.Вам необходимо рассчитать смещение времени и преобразовать его в QTTime.Время QTMovie начинается с нуля.

NSTimeInterval timeInterval = timeOffset;

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

movieTimeScale обычно может быть константой, например 600.В качестве альтернативы вы можете получить его из фильма:

long movieTimeScale = [_movie currentTime].timeScale;

Частота кадров здесь не имеет значения.

...