当使用带有CIFilter的AVVideoComposition时,如何访问AVAsynchronousCIImageFilteringRequest回调中的当前帧号?
我能做的最好的就是从时间上估计帧数:
^(AVAsynchronousCIImageFilteringRequest * _Nonnull request) {
double seconds = CMTimeGetSeconds(request.compositionTime);
double fps = [[_avAsset tracksWithMediaType:AVMediaTypeVideo] firstObject].nominalFrameRate;
int frame = round(seconds * fps);
// (Calculate filter parameters based on frame number)
}但这对我来说还不够精确。有办法访问帧号吗?
发布于 2016-06-22 01:22:34
关键是将frameDuration设置在AVMutableVideoComposition上,使其与底层AVAssetTrack的匹配。如果这样做,那么compositionTime的值甚至将是minFrameDuration的倍数,并且不会出现任何舍入问题。
AVMutableVideoComposition *vidComp =
[AVMutableVideoComposition videoCompositionWithAsset:self.avAsset
applyingCIFiltersWithHandler:
^(AVAsynchronousCIImageFilteringRequest * _Nonnull request) {
CMTime frame = self.avAssetTrack.minFrameDuration;
int frameNum = (request.compositionTime.value * frame.timescale) /
(request.compositionTime.timescale * frame.value);
// (Calculate filter parameters based on frame number)
}];
vidComp.frameDuration = self.avAssetTrack.minFrameDuration;在我的一个60 fps的MP4电影,avAssetTrack.minFrameDuration = (1001/60000),但vidComp.frameDuration = (1501/90000)之前,我更新它。这导致了回调中“compositionTime”的缓慢漂移,这导致了偶尔的重复帧。
发布于 2016-06-22 13:51:38
(讨厌)怎么样?
__block int frameNum = 0;
AVMutableVideoComposition *vidComp =
[AVMutableVideoComposition videoCompositionWithAsset:self.avAsset
applyingCIFiltersWithHandler:^(AVAsynchronousCIImageFilteringRequest * request) {
// (Calculate filter parameters based on frame number)
frameNum++;
}];这里有两个假设:
我不知道这些是不是安全的假设。
附注:帧速率经常是可变的,所以最小、最大和帧持续时间可能会产生误导。
UPDATE从问题中得到的AVComposition是为了在AVPlayer中寻找可查找的回放,这违反了假设1。
https://stackoverflow.com/questions/37754673
复制相似问题