处理AVAsset中的所有帧
我正在尝试通过AVAsset
中的每个帧,并将每个帧处理为一个图像。 我无法从我的search中find任何东西。
我试图完成的任务看起来像伪代码
for each frame in asset take the frame as an image and convert to a cvMat Process and store data of center points Store center points in array
我不知道该怎么写这个伪代码的唯一部分是通过每个帧,并捕获它在一个图像。
谁能帮忙?
一个答案是使用AVAssetImageGenerator 。
1)将电影文件加载到AVAsset
对象中。
2)创build一个AVAssetImageGenerator
对象。
3)传入您想要从电影中获取图像的帧的估计时间。
将AVAssetImageGenerator
对象的requestedTimeToleranceBefore
和requestedTimeToleranceAfter
设置为AVAssetImageGenerator
的2个属性将增加获取单个帧的能力,但会增加处理时间。
然而这个方法很慢,我还没find更快的方法。
//Load the Movie from a URL self.movieAsset = [AVAsset assetWithURL:self.movieURL]; NSArray *movieTracks = [self.movieAsset tracksWithMediaType:AVMediaTypeVideo]; AVAssetTrack *movieTrack = [movieTracks objectAtIndex:0]; //Make the image Generator AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:self.movieAsset]; //Create a variables for the time estimation Float64 durationSeconds = CMTimeGetSeconds(self.movieAsset.duration); Float64 timePerFrame = 1.0 / (Float64)movieTrack.nominalFrameRate; Float64 totalFrames = durationSeconds * movieTrack.nominalFrameRate; //Step through the frames for (int counter = 0; counter <= totalFrames; counter++){ CMTime actualTime; Float64 secondsIn = ((float)counter/totalFrames)*durationSeconds; CMTime imageTimeEstimate = CMTimeMakeWithSeconds(secondsIn, 600); NSError *error; CGImageRef image = [imageGenerator copyCGImageAtTime:imageTimeEstimate actualTime:&actualTime error:&error]; ...Do some processing on the image CGImageRelease(image); }