我正在开发iOS应用,使用带有后台配置的NSURLSession从相机胶卷上传视频。用户可以排队多个视频以进行上传(队列连续执行)。
单个上传包含:
requestAVAssetForVideo
方法获取PHAsset的AVURLAsset引用。 我可以排队多个视频,这个过程在前台运行良好。他们一个接一个地完成。
但是,如果我排队几个视频,然后背景应用程序。一旦执行到达copyItemAtURL:toURL:error:
阶段,它就会停止,直到我再次启动应用程序。 (我知道这是因为我在本地通知中发布调试语句,在锁定屏幕上可见)。
当应用程序落后时,是否可以使用copyItemAtURL:toURL:error:
?
如果没有,是否可以使用AVAssetExportSession?
编辑1 我连接到调试器时测试了这个,但没有,应用程序永远不会执行复制命令。但只有当应用程序再次被推出时才这样做。
编辑2
为了澄清,执行在复制命令停止。它不会产生错误并继续执行。实现fileManager:shouldCopyItemAtURL:toURL:
委托方法并不会改变事情。该方法的文档也说:
在复制每个项目之前,文件管理器会询问其代理是否正确 应该这样做。它是通过调用来实现的 fileManager:shouldCopyItemAtURL:toURL:method;如果那种方法不是 实现(或者该进程在OS X 10.5或更早版本中运行) 调用fileManager:shouldCopyItemAtPath:toPath:方法。如果 委托方法返回YES,或者委托方法没有实现 适当的方法,文件管理器继续复制文件或 。目录
答案 0 :(得分:1)
您为AVURLAsset获得了哪种URL?有两个,区别总是相关的(采用UIImagePickerController生成的URL与AVAssetReader / Writer使用的URL:
我可以用这个证明:
[[PHImageManager defaultManager] requestAVAssetForVideo:phAsset options:nil resultHandler:^(AVAsset *avAsset, AVAudioMix *audioMix, NSDictionary *info) {
NSURL *url = (NSURL *)[[(AVURLAsset *)avAsset URL] fileReferenceURL];
NSLog(@"url = %@", [url absoluteString]);
NSLog(@"url = %@", [url relativePath]);
}];
虽然phAsset是PHAsset对象,而avAsset是由PHImageManager生成的结果AVAsset对象,但从上面的代码输出到控制台将产生,例如:
2016-04-16 01:15:40.155 ChromaEpsilon[3423:933358] url = file:///.file/id=16777218.8262005
2016-04-16 01:15:40.155 ChromaEpsilon[3423:933358] url = /private/var/mobile/Media/DCIM/108APPLE/IMG_8421.MOV
我相信,不仅仅是这两个,而是从这里开始。