iOS开发,获取视频文件的相关信息

在视频相关开发的时候,并且在不进行播放的时候,很可能要获取视频的相关信息,比如总时长、帧率、每一帧的图片等。

需要导入库 AVFoundation,然后倒入文件AVAssetImageGenerator.h

AVURLAsset *avUrl = [AVURLAsset assetWithURL:url];

总时长

CMTime time = [avUrl duration];
double seconds = (float)time.value/(float)time.timescale;

这里要注意,一定要表明强制类型转换两个float相除,如果去掉的话就出现了整数,和最后的数据是对不上的。

每秒传输帧数

double fps = [[[avUrl tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] nominalFrameRate];

获取每一帧对应的图片

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)
{
  //图片在这里进行获取
}];

这里需要注意的是 imgeGenerator.requestedTimeToleranceAfter = kCMTimeZero; 和 imgeGenerator.requestedTimeToleranceBefore = kCMTimeZero; 一定要进行设置,要不当你想要一个时间点的某一帧的时候,他会在一个范围内找,如果有缓存,或者有在索引内的关键帧,就直接返回,从而优化性能。(具体来源于https://blog.csdn.net/oqqquzi1234567/article/details/42921025),进而导致你要的数据不是每一帧的,很可能一秒钟之内的图出来的都是同一个时刻的,我是深刻领会到这种问题的。

你可能感兴趣的:(iOS开发,获取视频文件的相关信息)