首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >iOS:不播放视频获取视频时长和缩略图

iOS:不播放视频获取视频时长和缩略图
EN

Stack Overflow用户
提问于 2013-02-07 09:53:40
回答 3查看 19.3K关注 0票数 23

我需要获取(本地)视频的持续时间,然后以UIImages的形式访问它的各个帧。

首先,我注册MPMovieDurationAvailableNotification事件,然后调用prepareToPlay。当收到事件时,我记下视频的持续时间,然后通过requestThumbnailImagesAtTimes请求帧。

这是有效的,但是视频似乎开始播放,即使我没有以任何方式将它添加到视图中(我可以听到音频在背景中播放)。

有没有办法在不实际播放视频的情况下获得视频的时长和帧数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-07 13:22:10

要获取持续时间:

代码语言:javascript
复制
NSURL *sourceMovieURL = [NSURL fileURLWithPath:somePath];
AVURLAsset *sourceAsset = [AVURLAsset URLAssetWithURL:sourceMovieURL options:nil];
CMTime duration = sourceAsset.duration;

要获取帧抓取:

代码语言:javascript
复制
AVAssetImageGenerator* generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:destinationAsset];

//Get the 1st frame 3 seconds in
int frameTimeStart = 3;
int frameLocation = 1;

//Snatch a frame
CGImageRef frameRef = [generator copyCGImageAtTime:CMTimeMake(frameTimeStart,frameLocation) actualTime:nil error:nil];
票数 42
EN

Stack Overflow用户

发布于 2013-02-07 12:48:14

使用MPMoviePlayerController调用setShouldAutoPlay:NO可以做到这一点:

代码语言:javascript
复制
 moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL: movieURL];
[moviePlayerController setShouldAutoplay:NO];   
[moviePlayerController prepareToPlay];

编辑:我在没有解释的情况下被否决了,但我会坚持这个答案。如果你需要使用MPMoviePlayerController,那么这将阻止媒体的自动播放,但仍然允许你根据我最初的问题获得持续时间和缩略图。

票数 6
EN

Stack Overflow用户

发布于 2021-11-23 13:43:24

使用此方法:

代码语言:javascript
复制
class func getVideoInfo(from url: URL,
                        completion: @escaping ((_ image: UIImage?, _ duration: CGFloat?) -> Void)) {
    DispatchQueue.global().async {
        let asset = AVAsset(url: url)
        let duration = CMTimeGetSeconds(asset.duration)
        let avAssetImageGenerator = AVAssetImageGenerator(asset: asset)
        avAssetImageGenerator.appliesPreferredTrackTransform = true
        let thumnailTime = CMTimeMake(value: 2, timescale: 1)
        do {
            let cgThumbImage = try avAssetImageGenerator.copyCGImage(at: thumnailTime, actualTime: nil)
            let thumbNailImage = UIImage(cgImage: cgThumbImage)
            DispatchQueue.main.async {
                completion(thumbNailImage, duration)
            }
        } catch {
            DispatchQueue.main.async {
                completion(nil, nil)
            }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14742262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档