ios - 来自 PHAsset url 的 NSInputStream - iOS 照片框架

标签 ios nsinputstream photosframework

我正在尝试从 AVURLAsset url 为来自照片框架的视频文件(或来自 PHAsset url 的照片)创建一个 NSInputStream。我的代码如下

mAsset = [NSInputStream inputStreamWithFileAtPath:[murl path]];
[mAsset open];

网址是file:///var/mobile/Media/DCIM/100APPLE/IMG_0519.JPG

现在当我阅读时

NSUInteger readLength = [mAsset read:(uint8_t *)data maxLength:maxSize];

返回的 readLength 为 -1。我认为这与 iOS 照片 Assets 的权限有关

如果这种方式不正确,我可以从照片框架 Assets 的视频或图像文件中流式传输数据吗? 任何帮助将不胜感激。

最佳答案

虽然这个问题有点老,但我将解释我是如何解决它的,因为我遇到了同样的问题并且从未在互联网上找到任何适用于 Photos Framework 的可行解决方案。

由于 Apple API 的设计方式,确实无法直接从 ALAsset 和 PHAsset 源文件上传。因此,让我首先讨论一下在过去使用旧的(现在已弃用的)API - AssetsLibrary 如何解决这个问题。

ALAssetRepresentation 有一个很棒的方法 getBytes:fromOffset:length:error: 直接转换为 NSInputStreamread:maxLength :。这为您提供了如何从 ALAsset 实例中放置流的多种选择 - 您可以选择 create a bound pair of input and output streams ,或者您可以选择稍微复杂一点的路径 subclassing NSInputStream .

因此,关于使用 Photos Framework,这为您提供了第一个解决方案:您可以尝试 get an ALAsset URL from a PHAsset然后回过头来从旧的 ALAssetRepresentation 创建一个流。是的,没有记录此 URL 转换,是的,AssetsLibrary 现在已弃用,但是嘿 - 这是一个选项。还有一个 article在 Medium 上表明它确实是一个可行的解决方案。

现在让我们转到照片框架。

在 iOS 9 中,Apple 引入了一个新类 PHAssetResourceManager,它适合我们的目的。这是冗长的方法 requestDataForAssetResource:options:dataReceivedHandler:completionHandler: a) 逐步为您提供 Assets 数据 block ; b) 它提供对这些底层数据资源的直接访问,并且如果照片存在于手机上(即不是来自 iCloud),则不需要任何额外的文件系统空间。旁注:“b)”中的陈述实际上并没有记录,但在现实生活中被证明是正确的——你可以尝试填满设备的存储并调用这个方法,它会很好地工作。但是,PHAssetResourceManager 有一些注意事项 - 它异步传送数据并且数据 block 的大小是任意的。很容易理解为什么这个新 API 看起来像它的样子——使用 Photos Framework,您可以使用相同的方法来处理本地和 iCloud Assets 。但总的来说,这个新方法并没有像 ALAssetRepresentationgetBytes:fromOffset:length:error: 方法那样很好地转换为 NSInputStream 的接口(interface)> 做了。但放心,我们可以利用此方法的一项功能使其对用户友好,这样它看起来就像旧的 getBytes:fromOffset:length:error: 方法一样。此方法 requestDataForAssetResource:options:dataReceivedHandler:completionHandler: 按顺序在串行队列上传送数据。这意味着我们可以使用 bounded blocking queue创建一个看起来像 func nextChunk() throws -> Data? 的同步方法。而有了这样的方法之后,获取 Assets 的字节数就 super 容易了。

实际上这正是我在我的图书馆所做的PHAssetResourceInputStream .它在从 Photos Framework 获取 Assets 字节后进行了所有繁重的工作,并为您提供了一个简单的 API,因此我希望它对遇到同样问题的人有所帮助。

长话短说

PHAssetResourceManager 让您开心。

关于ios - 来自 PHAsset url 的 NSInputStream - iOS 照片框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32626425/

相关文章:

ios - 谁在 pubnub 中发送消息? iOS

ios - 将 Objective-C 方法转换为 Swift for NSInputStream(将字节转换为 double )

ios - NSInputStream对于存储在本地文档目录中的文件返回nil

ios - PHImageManager requestImageForAsset 为 iCloud 照片返回 nil

ios - 是否可以在没有 Mac 的情况下为 iOS 制作 cordova CLI 应用程序?

iphone - Storyboard和 pageControl 有什么区别?

ios - 英特尔 XDK - 代码设计 - 未找到身份 - AdHoc - 分发配置文件

ios - 通过 NSInputStream 和 NSOutputStream 的视频流

swift - PHPhotoLibrary - 在 Swift 中多次调用 photoLibraryDidChange

ios - 在 iOS 中向图像添加关键字元数据