当前位置: > > > Swift - 获取视频截图(本地视频、网络视频的缩略图)

Swift - 获取视频截图(本地视频、网络视频的缩略图)

有时我们需要在界面上显示视频的缩略图,这样用户不用点开也能大概了解到视频的内容。下面分别演示如何获取本地视频,以及网络在线视频的视频截图。
样例的效果图如下,将获取到的截图(视频开始部分)显示在 imageView 中。

1,获取本地视频截图
import UIKit
import AVFoundation
import MobileCoreServices

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //获取本地视频
        let filePath = NSBundle.mainBundle().pathForResource("hangge", ofType: "m4v")
        let videoURL = NSURL(fileURLWithPath: filePath!)
        let avAsset = AVAsset(URL: videoURL)
        
        //生成视频截图
        let generator = AVAssetImageGenerator(asset: avAsset)
        generator.appliesPreferredTrackTransform = true
        let time = CMTimeMakeWithSeconds(0.0,600)
        var actualTime:CMTime = CMTimeMake(0,0)
        let imageRef:CGImageRef = try! generator.copyCGImageAtTime(time, actualTime: &actualTime)
        let frameImg = UIImage(CGImage: imageRef)
        
        //显示截图
        self.imageView.image = frameImg
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

2,获取网络视频截图
由于网络请求比较耗时,所以我们把获取在线视频的相关代码写在异步线程里。
import UIKit
import AVFoundation
import MobileCoreServices

class ViewController: UIViewController {
    
    @IBOutlet weak var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        //异步获取网络视频
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), {
            //获取网络视频
            let url = "http://www.hangge.com/hangge.mp4"
            let videoURL = NSURL(string: url)!
            let avAsset = AVURLAsset(URL: videoURL)
            
            //生成视频截图
            let generator = AVAssetImageGenerator(asset: avAsset)
            generator.appliesPreferredTrackTransform = true
            let time = CMTimeMakeWithSeconds(0.0,600)
            var actualTime:CMTime = CMTimeMake(0,0)
            let imageRef:CGImageRef = try! generator.copyCGImageAtTime(time, actualTime: &actualTime)
            let frameImg = UIImage(CGImage: imageRef)
            
            //在主线程中显示截图
            dispatch_async(dispatch_get_main_queue(), {
                self.imageView.image = frameImg
            })
        })
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
评论2
  • 2楼
    2017-04-10 17:02
    诗诗

    您好,请问怎么获取直播流的视频截图?

    站长回复

    直播流的视频截图我也没做过,暂时帮不了你了。

  • 1楼
    2016-07-03 19:41
    小玲玲

    可以做一个音乐播放器吗?既可以播放本地的也可以播放网络音乐《现在大部分的人都需要这一样咧,视屏播放器也是很多人在寻找的

    站长回复

    音乐播放、视频播放的我原来都有写过相关文章: 

    Swift - 使用AVKit播放本地视频,在线视频(AVPlayerViewController)
    文章样例提供了核心的播放方法,如果要做一个完整的播放器,可以在其之上做改进。比如增加各种播放控制、播放列表、美化界面等等。