特定帧的视频中的照片框架图像
Photos framework image from video at a certain frame
我制作了一个库集合视图,其中包含我从照片框架中获取的视频,我使用缩略图使用以下方法显示所有不同的视频
func requestImageForAsset(_ asset: PHAsset!, targetSize targetSize: CGSize, contentMode contentMode: PHImageContentMode, options options: PHImageRequestOptions!, resultHandler resultHandler: ((UIImage!, [NSObject : AnyObject]!) -> Void)!) -> PHImageRequestID
效果很好。
但是我的视频总是以黑框开始,所以所有的缩略图都是黑色的。我可以偏移拍摄快照图像的帧吗?
我认为您需要查看 AVFoundation 库来解码视频并获取您想要的帧。
要更新库中的占位符,请查看文档,您似乎需要创建一个 PHAssetChangeRequest
并在其上设置 placeholderForCreatedAsset
属性。然后您需要请求库在更改块中执行更改。
注意:如果这仅供您使用,您可以在照片中设置占位符框架,这应该反映在您的应用中。
您可以使用
获取关联的AVAsset
对象
func requestAVAssetForVideo(_ asset: PHAsset,
options options: PHVideoRequestOptions?,
resultHandler resultHandler: (AVAsset?,
AVAudioMix?,
[NSObject : AnyObject]?) -> Void) -> PHImageRequestID
然后将该资产加载到能够通过
获取特定时间缩略图的AVAssetImageGenerator
func copyCGImageAtTime(_ requestedTime: CMTime,
actualTime actualTime: UnsafeMutablePointer<CMTime>,
error outError: NSErrorPointer) -> CGImage!
这是我在我的项目中使用的代码,对我来说就像一个魅力
func generateThumnail(url: URL) -> UIImage? {
let asset = AVAsset(url: url)
let assetImgGenerate = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
assetImgGenerate.maximumSize = CGSize(width: 100, height: 100)
let time = CMTimeMake(1, 30)
if let img = try? assetImgGenerate.copyCGImage(at: time, actualTime: nil) {
return UIImage(cgImage: img)
}
return nil
}
以上函数将 return 视频 1 秒处的图像
这是通过您的视频的assetUrl 获取缩略图的方式
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
let mediaType = info[UIImagePickerControllerMediaType] as! String
if (mediaType == kUTTypeMovie as! String){
let tempVideo = info[UIImagePickerControllerMediaURL] as! URL
if let thumbnail = self.generateThumbnail(url: tempVideo) {
// Use your thumbnail
}
我制作了一个库集合视图,其中包含我从照片框架中获取的视频,我使用缩略图使用以下方法显示所有不同的视频
func requestImageForAsset(_ asset: PHAsset!, targetSize targetSize: CGSize, contentMode contentMode: PHImageContentMode, options options: PHImageRequestOptions!, resultHandler resultHandler: ((UIImage!, [NSObject : AnyObject]!) -> Void)!) -> PHImageRequestID
效果很好。 但是我的视频总是以黑框开始,所以所有的缩略图都是黑色的。我可以偏移拍摄快照图像的帧吗?
我认为您需要查看 AVFoundation 库来解码视频并获取您想要的帧。
要更新库中的占位符,请查看文档,您似乎需要创建一个 PHAssetChangeRequest
并在其上设置 placeholderForCreatedAsset
属性。然后您需要请求库在更改块中执行更改。
注意:如果这仅供您使用,您可以在照片中设置占位符框架,这应该反映在您的应用中。
您可以使用
获取关联的AVAsset
对象
func requestAVAssetForVideo(_ asset: PHAsset,
options options: PHVideoRequestOptions?,
resultHandler resultHandler: (AVAsset?,
AVAudioMix?,
[NSObject : AnyObject]?) -> Void) -> PHImageRequestID
然后将该资产加载到能够通过
获取特定时间缩略图的AVAssetImageGenerator
func copyCGImageAtTime(_ requestedTime: CMTime,
actualTime actualTime: UnsafeMutablePointer<CMTime>,
error outError: NSErrorPointer) -> CGImage!
这是我在我的项目中使用的代码,对我来说就像一个魅力
func generateThumnail(url: URL) -> UIImage? {
let asset = AVAsset(url: url)
let assetImgGenerate = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
assetImgGenerate.maximumSize = CGSize(width: 100, height: 100)
let time = CMTimeMake(1, 30)
if let img = try? assetImgGenerate.copyCGImage(at: time, actualTime: nil) {
return UIImage(cgImage: img)
}
return nil
}
以上函数将 return 视频 1 秒处的图像
这是通过您的视频的assetUrl 获取缩略图的方式
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
let mediaType = info[UIImagePickerControllerMediaType] as! String
if (mediaType == kUTTypeMovie as! String){
let tempVideo = info[UIImagePickerControllerMediaURL] as! URL
if let thumbnail = self.generateThumbnail(url: tempVideo) {
// Use your thumbnail
}