- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试从 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:
直接转换为 NSInputStream
的 read: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 。但总的来说,这个新方法并没有像 ALAssetRepresentation
的 getBytes: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/
我正在尝试将输入流转换为字符串。我尝试转换的输入流是 NSURLRequest.HTTPBodyStream,显然 httpbody 设置为 null 并在您发出请求后替换为流。我该怎么做呢?这是我目
我在使用 NSInputStream 时遇到问题。我有连接到服务器的客户端应用程序,然后服务器将开始通过 TCP 每秒大约 1 条消息重复向我的客户端应用程序发送消息。服务器只是向客户端广播消息,消息
我正在尝试创建一个简单的iPhone应用程序,它可以与服务器通信(目前正在我的计算机上运行并且工作正常)。我一直在尝试使用 NSStream 类,但遇到了很多问题。我真的只是想使用流来模拟 telne
是否有办法查看 nsinputstream 中的值,例如将其转换为字符串? 最佳答案 我假设您指的是从 NSInputStream 返回的数据: - (NSInteger)read:(uint8_t
我的应用程序使用 NSInputStream,如下所示: inputStream.delegate = self; [inputStream scheduleInRunLoop:[NSRunLoop
在我的应用程序中,我使用 NSStreams 进行客户端服务器通信。在事件 hasbytesAvailable 的 delegate 方法中,当我读取数据时返回 null 案例:当长度为4096时读取
当我从服务器接收数据时出现错误(数据只是字符串)。 例如 服务器发送数据(15000字节) 我的 iPhone 收到数据(7878 字节) 所以我尝试搜索,我知道方法是答案。 但我无法应用我的代码..
我正在尝试使用 NSInputStream 通过 TCP 套接字连接接收数据。在服务器端,我先发送数据大小,然后再发送数据本身。在 iOS 客户端,我需要从 NSInputStream 中提取前 4
请帮助我,我快疯了。我需要创建一个 NSInputStream,这样我就可以通过 wifi 从摄像头读取实时预览。liveViewStream 是一个 NSInputStream-Instance-V
我正在将一个 java 客户端移植到 iphone,我一直在想是否有一个围绕 NSInputStream 的包装器来从停止在指定分隔符处的流中读取字符串?我正在考虑类似 Javas Scanner 类
我想向 NSInputStream 添加三个“部分”:一个 NSString,另一个流的输出,然后是另一个 NSString。思路如下: 第一个和最后一个 NSString 代表 SOAP 请求的开始
全部, 我有一台服务器,它有一个用于通信的 TCP 套接字流。我需要访问该流并读取它需要发送给我的初始数据。 我目前的代码如下。老实说,我对此完全视而不见。我不确定这是否正确,更不用说适合这项工作了。
我正在尝试通过 NSInputStream 从我的文档目录中读取自定义文件,以将其上传到 FTP 服务器。我使用的代码与 SimpleFTPSample 中演示的代码完全相同由苹果公司提供。只要文件为
嘿伙计们,我正在从网络服务器上下载一个 yaml 文件。我的 NSInputStream 与本地 yaml 文件配合得很好(使用 file://filename.yaml url 方案) 以下是相关代
我正在尝试打断 [NSOutputstream write] 当连接丢失时。 但是,即使我使用 关闭流,它似乎仍然继续阻塞 [NSOutputstream close]. 我想要实现的只是在服务器连接
我需要使用 Windows 1252 编码将图像流式传输到 .NET 后端服务。所以我相信我需要创建一个 NSURLRequest 并将其 HTTPBodyStream 设置为使用图像数据创建的 NS
我有 openssl 服务器和 Objective-C 客户端。我这样发消息 uint32_t testD = 161; err = SSL_write(ssl_, &testD, sizeof(ui
我正在从服务器按顺序获取 NSData block ,超过大约。 4096 字节,按顺序。每个接收到的 block 的大小可能不同。 我想做的是将所有这些字节附加到某处,同时从数据的开头开始读取,顺序
我在一个文件中有 100 MB 的数据。这 100 mb 数据将被虚拟地划分。即,我需要创建一个指向不同 5MB block 的 NSInputStream。这可以通过使用 NSData 创建流来实现
我想将 NSInputStream 传递给 MPMoviePlayerController、MPMoviePlayerViewController 或其他任何东西。 输入流利用了 Apple 框架不支
我是一名优秀的程序员,十分优秀!