首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问AVAsynchronousCIImageFilteringRequest中的帧号?

如何访问AVAsynchronousCIImageFilteringRequest中的帧号?
EN

Stack Overflow用户
提问于 2016-06-10 18:07:53
回答 2查看 1.2K关注 0票数 2

当使用带有CIFilterAVVideoComposition时,如何访问AVAsynchronousCIImageFilteringRequest回调中的当前帧号?

我能做的最好的就是从时间上估计帧数:

代码语言:javascript
复制
^(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)
}

但这对我来说还不够精确。有办法访问帧号吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-22 01:22:34

关键是将frameDuration设置在AVMutableVideoComposition上,使其与底层AVAssetTrack的匹配。如果这样做,那么compositionTime的值甚至将是minFrameDuration的倍数,并且不会出现任何舍入问题。

代码语言:javascript
复制
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”的缓慢漂移,这导致了偶尔的重复帧。

票数 3
EN

Stack Overflow用户

发布于 2016-06-22 13:51:38

(讨厌)怎么样?

代码语言:javascript
复制
__block int frameNum = 0;

AVMutableVideoComposition *vidComp = 
    [AVMutableVideoComposition videoCompositionWithAsset:self.avAsset
        applyingCIFiltersWithHandler:^(AVAsynchronousCIImageFilteringRequest * request) {

        // (Calculate filter parameters based on frame number)

        frameNum++;
    }];

这里有两个假设:

  1. 您的处理程序按与框架相同的顺序调用。
  2. 处理程序一次不会被多个线程调用。

我不知道这些是不是安全的假设。

附注:帧速率经常是可变的,所以最小、最大和帧持续时间可能会产生误导。

UPDATE从问题中得到的AVComposition是为了在AVPlayer中寻找可查找的回放,这违反了假设1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37754673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档