2

すべての QTKit の例では、範囲を作成するために秒を使用しています。残念ながら、私にはフレーム番号があり、フレームを正確にする必要があります。ムービーからフレーム レートを取得する方法を理解できれば、フレーム レートを掛けることができると思います。

4

2 に答える 2

1

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 の経験に基づいて機能すると予想される方法です。

幸運を!

于 2009-12-16T10:46:00.533 に答える
0

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;
    }
}
于 2010-01-22T19:31:12.340 に答える