在視頻相關(guān)開(kāi)發(fā)的時(shí)候,并且在不進(jìn)行播放的時(shí)候,很可能要獲取視頻的相關(guān)信息,比如總時(shí)長(zhǎng)、幀率、每一幀的圖片等。
需要導(dǎo)入庫(kù) AVFoundation,然后倒入文件AVAssetImageGenerator.h
AVURLAsset *avUrl = [AVURLAsset assetWithURL:url];
總時(shí)長(zhǎng)
CMTime time = [avUrl duration];
double seconds = (float)time.value/(float)time.timescale;
這里要注意,一定要表明強(qiáng)制類型轉(zhuǎn)換兩個(gè)float相除,如果去掉的話就出現(xiàn)了整數(shù),和最后的數(shù)據(jù)是對(duì)不上的。
每秒傳輸幀數(shù)
double fps = [[[avUrl tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] nominalFrameRate];
獲取每一幀對(duì)應(yīng)的圖片
AVAssetImageGenerator *imgeGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:avUrl];
imgeGenerator.appliesPreferredTrackTransform = YES;
NSMutableArray *array = [[NSMutableArray alloc] init];
for (int i=0;i<= seconds * fps; i++) {
[array addObject:[NSValue valueWithCMTime:CMTimeMakeWithSeconds(i/fps, fps)]];
}
__block NSInteger i = 0;
imgeGenerator.requestedTimeToleranceAfter = kCMTimeZero;
imgeGenerator.requestedTimeToleranceBefore = kCMTimeZero;
[imgeGenerator generateCGImagesAsynchronouslyForTimes:array completionHandler:
^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error)
{
//圖片在這里進(jìn)行獲取
}];
這里需要注意的是 imgeGenerator.requestedTimeToleranceAfter = kCMTimeZero; 和 imgeGenerator.requestedTimeToleranceBefore = kCMTimeZero; 一定要進(jìn)行設(shè)置,要不當(dāng)你想要一個(gè)時(shí)間點(diǎn)的某一幀的時(shí)候,他會(huì)在一個(gè)范圍內(nèi)找,如果有緩存,或者有在索引內(nèi)的關(guān)鍵幀,就直接返回,從而優(yōu)化性能。(具體來(lái)源于https://blog.csdn.net/oqqquzi1234567/article/details/42921025),進(jìn)而導(dǎo)致你要的數(shù)據(jù)不是每一幀的,很可能一秒鐘之內(nèi)的圖出來(lái)的都是同一個(gè)時(shí)刻的,我是深刻領(lǐng)會(huì)到這種問(wèn)題的。