iOS開(kāi)發(fā),獲取視頻文件的相關(guān)信息

在視頻相關(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)題的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容