我创建了一个视频应用,用户可以在其中录制视频并添加一些其他信息。然后,用户可以在单独的屏幕上显示视频及其信息。
在信息屏幕上,我试图从视频中显示静止图像。如果我在该会话中打开信息屏幕,这会有效,但是当我重新编译并运行应用程序时,屏幕截图不再出现。我收到以下错误:
NSUnderlyingError=0x162b9350 "The operation couldn’t be completed. No such file or directory", NSLocalizedDescription=The requested URL was not found on this server.
视频位于设备的某个位置,因为我可以通过内置的“照片”来查看视频。应用
我使用以下代码执行url字符串的保存和生成预览图像。
保存视频网址
let videoURL = info[UIImagePickerControllerMediaURL] as! NSURL
let videoData = NSData(contentsOfURL: videoURL)
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String
let dataPath = path.stringByAppendingPathComponent("-cached.MOV")
videoData.writeToFile(dataPath, atomically: false)
NSUserDefaults.standardUserDefaults().setObject(dataPath, forKey: "dataPath")
videoNote.url = dataPath
创建预览图片
// filePathLocal == videoNote.url
func videoSnapshot(filePathLocal: NSString) -> UIImage? {
let vidURL = NSURL(fileURLWithPath:filePathLocal as String)
let asset = AVURLAsset(URL: vidURL, options: nil)
let generator = AVAssetImageGenerator(asset: asset)
generator.appliesPreferredTrackTransform = true
let timestamp: CMTime = asset.duration
var error: NSError?
if let imageRef = generator.copyCGImageAtTime(timestamp, actualTime: nil, error: &error){
return UIImage(CGImage: imageRef)
} else {
print("Image generation failed with error \(error)")
return nil
}
}
任何帮助非常感谢
答案 0 :(得分:0)
虽然我从未设法使videoSnapshot()
方法的代码生效,但我发现我可以使用以下内容生成预览镜头。缺点是无法控制拍摄图像的时间戳。
ALAssetsLibrary().assetForURL(nsURL, resultBlock: { (asset) -> Void in
if let ast = asset {
return image = UIImage(CGImage: ast.defaultRepresentation().fullResolutionImage().takeUnretainedValue())
}
})