在当前时间创建AVPlayer的缩略图或图像

时间:2013-03-12 12:04:59

标签: objective-c xcode ipad

我已经实现了AVPlayer,我希望在点击工具栏按钮时使用图片或缩略图,然后使用UIViewController在新的UIImageView中打开。图像的缩放应与AVPlayer完全相同。 segue已经有效了,我只需要实现我在当前播放时间获取图像。

谢谢!

6 个答案:

答案 0 :(得分:43)

<强>目标C

AVAsset *asset = [AVAsset assetWithURL:sourceURL];
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
CMTime time = CMTimeMake(1, 1);
CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);  // CGImageRef won't be released by ARC

<强>夫特

var asset = AVAsset.assetWithURL(sourceURL)
var imageGenerator = AVAssetImageGenerator(asset: asset!)
var time = CMTimeMake(1, 1)
var imageRef = try! imageGenerator!.copyCGImageAtTime(time, actualTime: nil)
var thumbnail = UIImage.imageWithCGImage(imageRef)
CGImageRelease(imageRef) // CGImageRef won't be released by ARC 

Swift 3.0

var sourceURL = URL(string: "Your Asset URL")
var asset = AVAsset(url: sourceURL!)
var imageGenerator = AVAssetImageGenerator(asset: asset)
var time = CMTimeMake(1, 1)
var imageRef = try! imageGenerator.copyCGImage(at: time, actualTime: nil)
var thumbnail = UIImage(cgImage:imageRef)
  

注意:根据您的swift版本解释Swift代码。

答案 1 :(得分:3)

试试这个

 - (UIImage*)takeScreeenShot {

 AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:vidURL
 options:nil];

 AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];

 imageGenerator.appliesPreferredTrackTransform = YES;

 NSError *err = NULL;

 CMTime time = CMTimeMake(1, 60); // time range in which you want
 screenshot

 CGImageRef imgRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL
 error:&err];

 return [[UIImage alloc] initWithCGImage:imgRef];

 }

希望这有帮助!!!

答案 2 :(得分:1)

Swift 2.x:

let asset = AVAsset(...)
let imageGenerator = AVAssetImageGenerator(asset: asset)
let screenshotTime = CMTime(seconds: 1, preferredTimescale: 1)
if let imageRef = try? imageGenerator.copyCGImageAtTime(screenshotTime, actualTime: nil) {

    let image = UIImage(CGImage: imageRef)

    // do something with your image
}

答案 3 :(得分:0)

添加以下代码以从视频生成缩略图。

AVURLAsset *assetURL = [[AVURLAsset alloc] initWithURL:partOneUrl options:nil]; 

AVAssetImageGenerator *assetGenerator = [[AVAssetImageGenerator alloc] initWithAsset:assetURL]; 

assetGenerator.appliesPreferredTrackTransform = YES;  

NSError *err = NULL; 

CMTime time = CMTimeMake(1, 2);     

CGImageRef imgRef = [assetGenerator copyCGImageAtTime:time actualTime:NULL error:&err]; 

UIImage *one = [[UIImage alloc] initWithCGImage:imgRef];    

答案 4 :(得分:0)

这是我在Swift中拍摄当前可见帧的方法:

关键是

  1. 获取CMTime
  2. 类型的播放器的当前时间
  3. 将该时间转换为Float64
  4. 类型的秒数
  5. 使用CMTime将第二个切换回CMTimeMake。秒数所在的第一个参数应该转换为Int64
  6. 代码:

    var myImage: UIImage?
    
    guard let player = player else { return }
    
    let currentTime: CMTime = player.currentTime() // step 1.
    let currentTimeInSecs: Float64 = CMTimeGetSeconds(currentTime) // step 2.
    let actionTime: CMTime = CMTimeMake(Int64(currentTimeInSecs), 1) // step 3.
    
    let asset = AVAsset(url: fileUrl)
    let imageGenerator = AVAssetImageGenerator(asset: asset)
    imageGenerator.appliesPreferredTrackTransform = true // prevent image rotation
    
    do{
        let imageRef =  try imageGenerator.copyCGImage(at: actionTime, actualTime: nil)
    
         myImage = UIImage(cgImage: imageRef)
    }catch let err as NSError{
        print(err.localizedDescription)
    }
    

答案 5 :(得分:0)

用于从视频生成缩略图的快速扩展

extension AVPlayer {
    func generateThumbnail(time: CMTime) -> UIImage? {
        guard let asset = currentItem?.asset else { return nil }
        let imageGenerator = AVAssetImageGenerator(asset: asset)

        do {
            let cgImage = try imageGenerator.copyCGImage(at: time, actualTime: nil)
            return UIImage(cgImage: cgImage)
        } catch {
            print(error.localizedDescription)
        }

        return nil
    }
}