Core Media
#AVFoundation
概要
主に AVFoundation にて、メディア再生における 時間 を表現し扱うための Framework。AVFoundation を含む Apple の Framework では、時間は NSTimeInterval で表現されていることが多い。これは実際には Double の typealias であり、単純な秒数を表現している。
メディア操作時には、扱っている時刻に誤差が生じないことが重要な課題となるが、NSTimeInterval の場合は、浮動小数点数の不確かさから誤差が生じてしまう恐れがある。この問題を解決するために、AVFoundation は CMTime というデータ型を利用している。
Core Media は、AVFoundation やその他上位のレイヤで利用されるメディア系の Framework から利用される、低レベルな C フレームワークである。
Performing Time-Based Operations | Media Playback Programming Guide
Core Media | Apple Developer Documentation
CMTime
CMTime は、分子と分母の組で有理数を表現する mutable な struct。value は分子であり、CMTimeValue は 64 bit の integer。timescale は分母であり、CMTimeScale は 32 bit の integer である。
code:swift
struct CMTime {
public var value: CMTimeValue
public var timescale: CMTimeScale
public var flags: CMTimeFlags
public var epoch: CMTimeEpoch
// ...
}
code:swift
// 0.25 seconds
let quarterSecond = CMTime(value: 1, timescale: 4)
// 10 second mark in a 44.1 kHz audio file
let tenSeconds = CMTime(value: 441000, timescale: 44100)
// 3 seconds into a 30fps video
let cursor = CMTime(value: 90, timescale: 30)
単純な時刻だけでなく、正の無限大や負の無限大、あるいは不定 (indefinite) も表現できる。immutable な値型である CFDictionary との間で相互変換が行える。また、その他様々な操作が Time Utilities として定義されている。異なるタイミングのタイムスタンプを識別するのに epoch が利用されるらしい。これは例えば、描画のループが行われている際に、異なるループだと異なる値にすることで、epoch が異なるタイムスタンプ同士で比較計算を行ってしまうことなどを避ける目的で利用されるようだ。
CMTime | Apple Developer Documentation