Фотографическое изображение рамки с видео в определенном кадре
Я создал коллекцию изображений, заполненную видеороликами, которые я извлекал из фреймворка Photos, я использую миниатюры для отображения всех разных видео, используя следующий метод.
func requestImageForAsset(_ asset: PHAsset!, targetSize targetSize: CGSize, contentMode contentMode: PHImageContentMode, options options: PHImageRequestOptions!, resultHandler resultHandler: ((UIImage!, [NSObject : AnyObject]!) -> Void)!) -> PHImageRequestID
который отлично работает.
Но мои видео всегда начинаются с черной рамки, поэтому все миниатюры черные. могу ли я компенсировать кадр, из которого он принимает снимок?
Ответы
Ответ 1
Это код, который я использовал в моем проекте, который работает как прелесть для меня
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
}
Вышеуказанная функция вернет изображение в течение 1 секунды видео
Это способ передачи ресурса вашего видео для получения эскиза
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
}
Ответ 2
Вы можете получить связанный объект 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!
Ответ 3
Я думаю, вам нужно смотреть библиотеки AVFoundation, чтобы декодировать видео и захватить рамку, которую вы хотите сами.
Чтобы обновить заполнители в библиотеке, смотрящей на документы, кажется, что вам нужно создать PHAssetChangeRequest
и установить на нем свойство placeholderForCreatedAsset
. Затем вам нужно запросить, чтобы изменение было выполнено библиотекой в блоке changeblock.
Примечание. Если это только для вашего использования, вы можете установить рамку-заполнитель в Фото, и это должно быть отражено в вашем приложении.