PHAsset 复制视频完成

Posted

技术标签:

【中文标题】PHAsset 复制视频完成【英文标题】:PHAsset copy video completion 【发布时间】:2018-08-27 12:07:19 【问题描述】:

我希望将视频文件从照片库复制到我的应用的 Documents 目录并希望收到有关完成的通知。这是我的工作:

    let videoAsset = fetchResult.object(at: indexPath.item)
    print(videoAsset.description)

    let options = PHVideoRequestOptions()
    options.version = .original

    PHImageManager.default().requestAVAsset(forVideo: videoAsset, options: options)  [weak self] (avAsset, audioMix, info) in

        if let avurlAsset = avAsset as? AVURLAsset 
            let url = avurlAsset.url
            let toUrl = //some Url
            let fileManager = FileManager.default

            do 
              try fileManager.copyItem(at: url, to: toUrl)
             catch 
               NSLog("Unable to copy file from \(url) to \(toUrl)")
            
        
    

这种方法的唯一问题是我无法收到 copyItem 完成的通知。至少在复制完成之前阻塞的 copyItem 方法(或完全不同的方法)的替代方法是什么?是否可以使用 FileHandle 并读取连续字节并写入另一个文件?这足够同步吗?

编辑:正如 Alex 所指出的,copyItem 实际上是同步例程。仔细检查后,我发现我有时会在复制时出错。不知道为什么当它是我复制的应用程序的 Documents 文件夹时出现权限错误。

  2018-08-27 20:30:07.485841+0530 MyProject[3577:1288452] Copying file...
2018-08-27 20:30:07.487880+0530 MyProject[3577:1288452] stat on /var/mobile/Media/DCIM/107APPLE/IMG_7915.MP4: Operation not permitted
2018-08-27 20:30:07.512994+0530
 MyProject[3577:1288452] Unable to copy file from    file:///var/mobile/Media/DCIM/107APPLE/IMG_7915.MP4 to    file:///var/mobile/Containers/Data/Application/CC13FD5A-E4CF-42A1-931F-2F1FFE799C15/Documents/IMG-0027.mov, Error Domain=NSCocoaErrorDomain Code=513 "“IMG_7915.MP4” couldn’t be copied because you don’t have permission to access “Documents”." UserInfo=   
NSSourceFilePathErrorKey=/var/mobile/Media/DCIM/107APPLE/IMG_7915.MP4,    NSUserStringVariant=(
   Copy
  ),   

  NSDestinationFilePath=/var/mobile/Containers/Data/Application/CC13FD5A-E4CF-42A1-931F-2F1FFE799C15/Documents/IMG-0027.mov, NSFilePath=/var/mobile/Media/DCIM/107APPLE/IMG_7915.MP4, NSUnderlyingError=0x111c441c0 Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"

【问题讨论】:

【参考方案1】:

Copyitem:将指定路径的item同步复制到新位置。

如果项目复制成功或文件管理器的代理故意停止操作,则返回 true。如果发生错误,则返回 false。

这是一个同步方法,所以在catch之后执行后没有错误就表示复制成功了。

https://developer.apple.com/documentation/foundation/filemanager/1407903-copyitem

【讨论】:

看来确实存在复制错误。我已经用编辑更新了这个问题。 尝试根据您的日志将权限添加到 plist 中。因为它说:因为您没有访问“文档”的权限。

以上是关于PHAsset 复制视频完成的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能给 PHAsset 一个标志?

在 Nativescript 应用程序中将 PHAsset/AVAsset 转换为 mp4 视频

如何在 iOS 中通过 UIActivityViewController 导出 PHAsset 视频

如何从视频 URL 获取视频的 PHAsset?

如何从 PHAsset 获取视频的缩略图?

从 PHAsset 获取视频时如何检测视频是不是为横向/纵向?