AVFoundation視頻處理的時(shí)間CMTime

一、CMTime

Core Media定義的一種時(shí)間數(shù)據(jù)類(lèi)型

typedef struct
{
    CMTimeValue value;  //64位有符號(hào)整型變量瓮床,作為分子
    CMTimeScale timescale;   //32位有符號(hào)整型變量,作為分母
    // value/timescale = 對(duì)應(yīng)時(shí)間-秒
    CMTimeFlags flags; //位掩碼,表示時(shí)間的指定狀態(tài)信轿,比如判定詩(shī)句是否有效晃痴、不確定或是是否出現(xiàn)舍入等
    CMTimeEpoch epoch;      
} CMTime;

1、創(chuàng)建CMTime

  • 1财忽、CMTimeMake()
    CMTime CMTimeMake( int64_t value,int32_t timescale)

創(chuàng)建一個(gè)代表3秒的CMTime表達(dá)式(value/timescale):

CMTime ts1 = CMTimeMake(3, 1);
CMTime ts2 = CMTimeMake(1800, 600);
CMTime ts3 = CMTimeMake(132300, 44100);

//打印時(shí)間結(jié)果
CMTimeShow(ts1);
CMTimeShow(ts2);
CMTimeShow(ts3);

//打印結(jié)果
{3/1 = 3.000}
{1800/600 = 3.000}
{132300/44100 = 3.000}

在處理視頻內(nèi)容時(shí)常見(jiàn)的時(shí)間刻度為600倘核,這是大部分常用視頻幀率24FPS、25FPS即彪、30FPS的公倍數(shù)紧唱。音頻常見(jiàn)的時(shí)間刻度就是采樣率,如44.1kHz(44100)隶校、48kHz(48000)漏益。

  • 2、CMTimeMakeWithSeconds()

CMTime CMTimeMakeWithSeconds( Float64 seconds, int32_t preferredTimescale)

CMTime t = CMTimeMakeWithSeconds(5, 1); // 5 seconds

CMTimeShow(t);
//{5/1 = 5.000}
  • 3惠况、CMTimeMakeFromDictionary
NSDictionary *timeData = @{(id)kCMTimeValueKey : @2,
                           (id)kCMTimeScaleKey : @1,
                           (id)kCMTimeFlagsKey : @1,
                           (id)kCMTimeEpochKey : @0};
CMTime t = CMTimeMakeFromDictionary((__bridge CFDictionaryRef)timeData); 

CMTimeShow(t);
//{2/1 = 2.000}
   

2遭庶、CMTime運(yùn)算

  • 1、加減
CMTime ts1 = CMTimeMake(3, 1);
CMTime ts2 = CMTimeMake(5, 2);
    
CMTime result;
result = CMTimeAdd(ts1, ts2);
CMTimeShow(result);
//{11/2 = 5.500}
    
result = CMTimeSubtract(ts1, ts2);
CMTimeShow(result);
//{1/2 = 0.500}
  • 2稠屠、比較
CMTime t1 = CMTimeMake(300, 100); // 3 seconds
CMTime t2 = CMTimeMakeWithSeconds(5, 1); // 5 seconds

CMTimeCompare()

int32_t r  = CMTimeCompare(t1, t2);
NSLog(@"compare: %d",r);
//t1 < t2   => -1
//t1 == t2  => 0
//t1 > ts   => 1

CMTIME_COMPARE_INLINE()

NSLog(@"t1 > t2 => %@",CMTIME_COMPARE_INLINE(t1, >, t2) ? @"YES":@"NO");
// t1 > t2 => NO
  • 3峦睡、驗(yàn)證CMTIME_IS_VALID()
NSLog(@"ti is valid :%@",CMTIME_IS_VALID(t1) ? @"YES":@"NO");
// ti is valid :YES

3、CMTime轉(zhuǎn)換為秒

Float64 CMTimeGetSeconds( CMTime time)

CMTime t1 = CMTimeMake(3001, 100);
NSLog(@"second : %f",CMTimeGetSeconds(t1));
//second : 30.010000

4权埠、轉(zhuǎn)換為對(duì)象NSValue

+ (NSValue *)valueWithCMTime:(CMTime)time;

CMTime structTime = CMTimeMake(1, 3);

NSValue *valueTime = [NSValue valueWithCMTime:structTime];
NSLog(@"%@", valueTime);
//CMTime: {1/3 = 0.333}

structTime = [valueTime CMTimeValue];
CMTimeShow(structTime);
//{1/3 = 0.333}

5榨了、轉(zhuǎn)換字典N(xiāo)SDictionary

 CMTime structTime = CMTimeMake(1, 3);
NSDictionary *timeDict = CFBridgingRelease(CMTimeCopyAsDictionary(structTime, NULL));
NSLog(@"%@", timeDict);

structTime = CMTimeMakeFromDictionary((__bridge CFDictionaryRef)(timeDict));
CMTimeShow(structTime);

/*
 {
    epoch = 0;
    flags = 1;
    timescale = 3;
    value = 1;
}
{1/3 = 0.333}

*/

二、CMTimeRange

時(shí)間范圍的數(shù)據(jù)類(lèi)型:CMTimeRange攘蔽,由兩個(gè)CMTime值組成龙屉,第一個(gè)定義時(shí)間范圍的起點(diǎn),第二個(gè)定義時(shí)間范圍的持續(xù)時(shí)間满俗。

typedef struct
{
    CMTime          start;
    CMTime          duration;
} CMTimeRange;

1转捕、創(chuàng)建

  • 1、CMTimeRangeMake()

CMTimeRange CMTimeRangeMake( CMTime start, CMTime duration)
根據(jù)開(kāi)始時(shí)間點(diǎn)與持續(xù)時(shí)間確定時(shí)間范圍唆垃。

//創(chuàng)建一個(gè)時(shí)間范圍五芝,從時(shí)間軸的5秒位置開(kāi)始,持續(xù)時(shí)長(zhǎng)5秒
CMTime duration = CMTimeMake(5, 1);
CMTimeRange range = CMTimeRangeMake(duration, duration);
CMTimeRangeShow(range);

//{{5/1 = 5.000}, {5/1 = 5.000}}
  • 2辕万、CMTimeRangeFromTimeToTime()

CMTimeRange CMTimeRangeFromTimeToTime( CMTime start, CMTime end )
根據(jù)起始時(shí)間點(diǎn)和終止時(shí)間點(diǎn)枢步,確定時(shí)間范圍。

CMTime beginTime = CMTimeMake(5, 1);
CMTime endTime = CMTimeMake(12, 1);
CMTimeRange rangeTime = CMTimeRangeFromTimeToTime(beginTime, endTime);
CMTimeRangeShow(rangeTime);
//{{5/1 = 5.000}, {7/1 = 7.000}}

2渐尿、運(yùn)算

定義變量:

CMTime duration = CMTimeMake(5, 1);
CMTimeRange range = CMTimeRangeMake(duration, duration);
CMTimeRangeShow(range);
//{{5/1 = 5.000}, {5/1 = 5.000}}
    
CMTime beginTime = CMTimeMake(7, 1);
CMTime endTime = CMTimeMake(12, 1);
CMTimeRange rangeTime = CMTimeRangeFromTimeToTime(beginTime, endTime);
CMTimeRangeShow(rangeTime);
//{{7/1 = 7.000}, {5/1 = 5.000}}

取交叉時(shí)間范圍

CMTimeRange intersetionRange = CMTimeRangeGetIntersection(range, rangeTime);
CMTimeRangeShow(intersetionRange);
//{{7/1 = 7.000}, {3/1 = 3.000}}

取時(shí)間范圍總和

CMTimeRange unionRange = CMTimeRangeGetUnion(range, rangeTime);
    CMTimeRangeShow(unionRange);
//{{5/1 = 5.000}, {7/1 = 7.000}}

3醉途、轉(zhuǎn)換為對(duì)象NSValue

+ (NSValue *)valueWithCMTimeRange:(CMTimeRange)timeRange

CMTimeRange structTimeRange = CMTimeRangeMake(kCMTimeZero, kCMTimePositiveInfinity);

NSValue *valueTimeRange = [NSValue valueWithCMTimeRange:structTimeRange];
NSLog(@"%@", valueTimeRange);
//CMTimeRange: {{0/1 = 0.000}, {+INFINITY}}

structTimeRange = [valueTimeRange CMTimeRangeValue];
CMTimeRangeShow(structTimeRange);
//{{0/1 = 0.000}, {+INFINITY}}

4、轉(zhuǎn)換成字典N(xiāo)SDictionary

NSDictionary *timeRangeDict = CFBridgingRelease(CMTimeRangeCopyAsDictionary(structTimeRange, NULL));
NSLog(@"%@", timeRangeDict);

structTimeRange = CMTimeRangeMakeFromDictionary((__bridge CFDictionaryRef)(timeRangeDict));
CMTimeRangeShow(structTimeRange);

/*
 {
    duration =     {
        epoch = 0;
        flags = 5;
        timescale = 0;
        value = 0;
    };
    start =     {
        epoch = 0;
        flags = 1;
        timescale = 1;
        value = 0;
    };
}
{{0/1 = 0.000}, {+INFINITY}}
*/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砖茸,一起剝皮案震驚了整個(gè)濱河市隘擎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凉夯,老刑警劉巖嵌屎,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件推正,死亡現(xiàn)場(chǎng)離奇詭異恍涂,居然都是意外死亡宝惰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)再沧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)尼夺,“玉大人,你說(shuō)我怎么就攤上這事炒瘸∮俣拢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵顷扩,是天一觀的道長(zhǎng)拐邪。 經(jīng)常有香客問(wèn)我,道長(zhǎng)隘截,這世上最難降的妖魔是什么扎阶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮婶芭,結(jié)果婚禮上东臀,老公的妹妹穿的比我還像新娘。我一直安慰自己犀农,他們只是感情好惰赋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著呵哨,像睡著了一般赁濒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孟害,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天拒炎,我揣著相機(jī)與錄音,去河邊找鬼纹坐。 笑死枝冀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耘子。 我是一名探鬼主播果漾,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谷誓!你這毒婦竟也來(lái)了绒障?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捍歪,失蹤者是張志新(化名)和其女友劉穎户辱,沒(méi)想到半個(gè)月后鸵钝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庐镐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年恩商,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片必逆。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怠堪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出名眉,到底是詐尸還是另有隱情粟矿,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布损拢,位于F島的核電站陌粹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏福压。R本人自食惡果不足惜掏秩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隧膏。 院中可真熱鬧哗讥,春花似錦、人聲如沸胞枕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腐泻。三九已至决乎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間派桩,已是汗流浹背构诚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铆惑,地道東北人范嘱。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像员魏,于是被迫代替她去往敵國(guó)和親丑蛤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容