【发布时间】:2012-01-27 18:23:58
【问题描述】:
有一个非常酷的 iPhone 应用程序叫 Viddy,您可以在其中下载过滤器以应用于视频。
他们如何在应用外打包过滤器,并通过下载提供给用户?
【问题讨论】:
-
我真的很想知道他们是如何做到这一点的......有人有想法吗?
-
怎么知道过滤器代码在app外?
标签: iphone objective-c ios ios4 ios5
有一个非常酷的 iPhone 应用程序叫 Viddy,您可以在其中下载过滤器以应用于视频。
他们如何在应用外打包过滤器,并通过下载提供给用户?
【问题讨论】:
标签: iphone objective-c ios ios4 ios5
一种方法是创建一个in-app purchase,它只是一个描述image processing graph 的文档。 (想想像 Shake 或 Nuke 这样的节点图表示。)例如,发光通常被实现为与原始图像混合的模糊图像。您可以创建一个描述该处理图的文档。将此类文档下载到您的应用程序后,您可以使用 Core Image filters 实现它,或使用 GLSL 编写您自己的文档,甚至直接 CPU 处理。
【讨论】:
这很简单,它们确实使用着色器,并且是从互联网上下载的。
Viddy.app 中的Library/effects 文件夹。您会在那里找到 afx_1_0.xml 和 vfx_1_0.xml 文件。shader.fx3 定义了着色器,thumb.png 用于缩略图,vignette.png 文件也用于此着色器。我们确实在未命名的应用程序中使用了相同的方法,但我们确实加密了所有这些信息以及着色器本身以避免像这样的分析:)
注释中的加密、解密示例请求
.fx 文件。打开 Xcode 并转到构建规则,您可以在其中为 *.fx 文件定义构建规则。将其设置为运行您的 Custom script:,它看起来像这样:
ENC_KEY="你的加密密钥"
${PROJECT_DIR}/../Tools/bin/crypt -e -k $ENC_KEY -i ${INPUT_FILE_PATH} \ -o "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/${INPUT_FILE_BASE}.cfx"
此脚本生成.cfx 文件,其内容与.fx 文件相同,但已加密。
crypt 二进制来自这个项目:download crypt Xcode project。EncryptedFileURLProtocol.* 和NSURL+EncryptedFileURLProtocol.* 文件复制到您的项目中。[NSURLProtocol registerClass:[EncryptedFileURLProtocol class]];
encrypted-file 而不是file://。此任务处理来自演示项目的NSURL 类别,您可以简单地使用[NSURL encryptedFileURLWithPath:@"/path/to/my/encrypted/file"]。这非常简单,您可以在示例应用程序中找到您需要的大部分信息(上面的链接)。您也可以在应用程序中破坏您的加密/解密密钥,因此,人们必须思考并且密钥不易读取。现在,当您通过此NSURL 访问加密文件时,它会在应用程序中自动为您解密。解密密钥在EncryptedFileURLProtocol.m文件中的sharedKey中设置。
【讨论】:
执行此操作的最简单方法是将过滤器构建到应用本身中,并通过应用内购买解锁使用它们的能力。
如果您想避免下载所需的所有额外图像或其他部分,您仍然可以将代码包含在主应用程序中,然后下载所需的额外资源。您可以使用 Urban Airship's IAP support 之类的东西来托管和下载 IAP 资源。 (您可能还想以这种方式研究 iOS 6 的新功能。)
【讨论】:
GLSL 着色器可以源代码形式下载,然后用于处理。它提供了非常灵活的方式来在应用发布后创建新的过滤器。另一方面,更新(下载)额外的过滤器数据可能就足够了。例如,Instagram 对大多数滤镜使用相同的颜色曲线技术,但曲线数据不同,因此他们可以根据需要在线更新滤镜。
【讨论】:
视频过滤器也使用 CIImage 类,如用于图像的 intagram 应用程序。请参阅此处的链接:“http://www.icapps.be/face-detection-with-core-image-on-live-video/”。现在过滤器可以下载过滤器(实际上它的应用内购买发生)。
将购买/下载方法放在机箱下方:
case SKPaymentTransactionStatePurchased:
[self ...];
所以发生的事情是免费购买可用于任何视频的过滤器。实际上方法是在 SKPaymentTransactionStatePurchased 之后启用过滤器。
【讨论】: