ios - 创建 AVPlayer 视频的动画、部分模糊

标签 ios swift opengl-es avplayer core-image

我有一个 AVPlayer 正在播放视频,我想对其应用一种“高斯高斯”/“反向虹膜”模糊。

我的意思是,我对视频的中心应用了最高量的模糊,当您远离该中心点时,视频的模糊程度会减少。像这样:

Botticelli Venus Blurred

然后,我希望能够在视频播放时移动该模糊(例如在视频中来回移动)。

有什么想法可以做到这一点吗?

最佳答案

由于巨大的性能增益,高斯模糊通常分为垂直和水平两个 channel 。如果 Canvas 的一部分没有模糊,则不能直接应用此方法。因此,一种直接的方法是创建一个单 channel 模糊着色器,向其中添加焦点位置和大小。然后,您可以根据片段的当前位置调整应用于该像素的模糊程度。这只是简单地修改标准矩阵,逐步在片段周围使用更少的样本,并在靠近焦点时降低远像素的效果(将差异添加到中心像素)。

更聪明的解决方案是将图像的模糊版本与原始版本混合。这个结果可能不完全相同,但非常接近。有很多方法可以做到这一点,如果可能的话,最好模糊整个视频并保留原始内容。然后,您可以使用 2 个纹理并将它们在每一帧上混合在一起以获得所需的效果。但如果你很棒,你将生成一个视频,其中包含原始版本和模糊版本(例如上半部分是原始版本,下半部分是模糊版本),这将提高性能,并通过寻找 2 个不同的版本来消除任何可能的问题视频。

因此,要使用焦点将两者混合在一起,您将拥有几乎相同的着色器过程,但更容易。使用片段着色器中的焦点和焦点大小。然后计算当前片段与焦点之间的距离,以获得需要应用的模糊图像的比例。通过比例,您可以使用 mix 有效地将两者结合起来。

如果用户可以更改焦点,则此过程特别好,因为无需进行额外的计算。仍然模糊整个视频可能会非常耗时。

这两个过程之间的任何事情都可以完成。例如,您可以使用带有附加纹理的 FBO 来实时创建样本的模糊版本,然后将mix与原始纹理和 FBO 纹理一起使用。

关于ios - 创建 AVPlayer 视频的动画、部分模糊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38688919/

相关文章:

android - 在纯原生 Android 应用程序中呈现文本

ios - 根据 NSDictionary 键值将 NSArray 拆分为子数组

swift - __NSCFString nsli_lowerAttribute :intoExpression:withCoefficient:forConstraint: this occur in ios 10 only

ios - swift 5 : Why is my data within struct suddenly empty/nil?

swift - 什么时候使用 obj!.attr 和 obj?.attr?

ios - 在 Swift 中的某些场景上显示广告

opengl - 这个简单的FxAA如何工作?

iphone - 通过触摸移动事件限制拖动距离

objective-c - 什么时候需要子类化 UIViewController,什么时候可以实例化它?

ios - iPhone X : : Error : safe-area-inset property is not supported for this property?