すべての QTKit の例では、範囲を作成するために秒を使用しています。残念ながら、私にはフレーム番号があり、フレームを正確にする必要があります。ムービーからフレーム レートを取得する方法を理解できれば、フレーム レートを掛けることができると思います。
2 に答える
mediaAttributes
次の をクエリすることで、特定のビデオ メディアのフレーム レートを計算できるはずですQTMedia
。
QTMediaDurationAttribute
QTMediaSampleCountAttribute
(それらは QTKit ドキュメントで説明されています ここ)
計算には次の式を使用します。
QTTime duration = ... // value get from mediaAttribute
NSNumber sample_count = ... // value get from mediaAttribute
double fps = (sample_count.longValue * duration.timeScale) / duration.timeValue;
免責事項:
これが機能するかどうかは試していませんが、QuickTime C API と QuickTime File Format の経験に基づいて機能すると予想される方法です。
幸運を!
Quicktime が使用するファイル コンテナとコーデックの多くは、圧縮率を高めるために可変フレーム レートを使用するため、フレーム レートを乗算してもフレームは正確ではありません。これは、フレームが一定時間フリーズするあらゆる種類のムービーで見られます。例として、macbreak のThe Road to 1080p, part1 を参照してください。
OSX 10.6 で導入された QTMovie メソッドframeStartTime:atTimeおよびframeEndTime: atTime を使用して、フレームの正確な範囲を実行できます。これらは、フレームのデコードを行わずに、それぞれフレームの開始と終了を提供します。
たとえば、ムービーのすべてのフレームをカウントするには:
// Initialize QTMovie object called 'movie', disable looping, etc
[movie gotoEnd];
QTTime endTime = [movie currentTime];
[movie gotoBeginning];
QTTime curTime = [movie currentTime];
unsigned long numFrames = 0;
while (true)
{
% get the end time of the current frame
[movie frameEndTime:&curTime];
numFrames++;
% If we get to the last frame, stop counting
if (QTTimeCompare(curTime, endTime) == NSOrderedSame)
{
break;
}
}