web-dev-qa-db-ja.com

CMTimeとCMTimeMakeを理解しよう

1)CMTimeMake(1,10)は、1秒の持続時間と10または10フレーム/秒のタイムスケールを意味します。これは、10フレームのビデオの1秒間を意味しますか?

2)

CMTime lastTime=CMTimeMake(1,10);
CMTime frameTime=CMTimeMake(1, 10);
CMTime currentTime=CMTimeAdd(lastTime, frameTime)

=(2、10)?

2秒のビデオと、1秒あたり10フレームのcurrentTimeですか?

137
lilzz

1)CMTimeMake(1,10)は実際には値1とタイムスケール10を意味します。これらは分子と分母であるため、1秒ではなく1/10秒です。

2)結果はCMTimeMake(2, 10)のようになります。これは2/10秒です。

155
Peter DeWeese

ピーターは正しい。次のコードは、概念をより明確にします。

1)

Float64 seconds = 5; 
int32_t preferredTimeScale = 600;
CMTime inTime = CMTimeMakeWithSeconds(seconds, preferredTimeScale);
CMTimeShow(inTime);

上記のコードは次のとおりです。{3000/600 = 5.000}

これは、合計フレーム数が5秒で、3000フレームで毎秒600フレームのタイムスケールを意味します。

2)

int64_t value = 10000;
int32_t preferredTimeScale = 600;
CMTime inTime = CMTimeMake(value, preferredTimeScale);
CMTimeShow(inTime);

これは{10000/600 = 16.667}を与えます

これは、1秒あたり600フレームのタイムスケールを持つ10000フレームで、16.667秒の合計期間を意味します。

CMTimeMake(int64_t value、int32_t timescale)とCMTimeMakeWithSeconds(Float64 seconds、int32_t preferredTimeScale)の違いに注意してください。

この説明がお役に立てば幸いです。さらに明確にするために、この投稿にさらに質問を投稿することをheしないでください。

133
Raunak

CMTimeMake(A, B)では、有理数、正確な端数A / B秒を保存します

  • CMTimeMake(1, 4)->時間間隔0.25秒

CMTimeMakeWithSeconds(A, B)を使用すると、AsecondsBステップの解像度で保存できます

  • CMTimeMakeWithSeconds(0.25, ...)->時間間隔0.25秒

通常、CMTimeMakeWithSeconds(time, NSEC_PER_SEC)が表示されます。 NSEC_PER_SECは実質的に「最大解像度」を意味します。

35
bcattle

1秒(私のように)の間隔の作り方のみを知りたい場合、これがあなたの答えです:

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);
6
mgyky

CMTime構造体はlength of time that is stored as rational number.を表し、CMTimeは値とタイムスケールフィールドを持ち、時間値/タイムスケール秒を表します。

これを参照SO明確な回答

2
kandelvijaya