CMTimeとCMTimeMakeを理解しようとする


145

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秒のビデオとcurrentTimeの毎秒10フレーム?


1
ビデオが48 FPS(フレーム/秒)の場合、1 CMTimeMake(1, 48)/48秒ごとにコードのブロックを実行するのは簡単です。つまり、フレームごとに1ブロック
Honey

回答:


163

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

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


11
なぜアップルのリファレンスはこれを言わないのですか?
vgonisanz 2013年

4
今それは言う:value/timescale = seconds明示的に。
JP Illanes 2014

137

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

1)

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

上記のコードは次のようになります:{3000/600 = 5.000}

つまり、合計時間は5秒、タイムスケールは1秒あたり600フレームの3000フレームです。

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秒、int32_t preferredTimeScale)の違いに注意してください

この説明がお役に立てば幸いです。詳細については、この投稿に質問を投稿してください。


とても良い説明
コリーフロイド

なぜwhen が違うように設定されているsetMaxRecordedDuration必要があるのかしら。誰もが盲目的に600を使用しており、正確に何をしているのかについての良い説明はありません。preferredTimeScaleframe_rate
ダッシュ1995

2
@dashesy 600は、一般的なビデオフレームレートの倍数です。ウォーレンムーアはwarrenmoore.net/understanding-cmtimeでそれをかなりよく説明しています。
danimal

38

ではCMTimeMake(A, B)、あなたは有理数、正確な分数の保存A / B

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

ではCMTimeMakeWithSeconds(A, B)、あなたは保存A の解像度にB段階

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

よく見CMTimeMakeWithSeconds(time, NSEC_PER_SEC)ます。NSEC_PER_SEC効果的「という意味の最大解像度を」。


8

あなたが1秒の間隔を作る方法だけを知りたいのであれば(私のように)、これはあなたの答えです:

int seconds = 1;

CMTime interval = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.