我需要获取(本地)视频的持续时间,然后以UIImage
s的形式访问它的各个帧。
首先,我注册MPMovieDurationAvailableNotification
事件,然后调用prepareToPlay
。当收到事件时,我记下视频的持续时间,然后通过requestThumbnailImagesAtTimes
请求帧。
这是有效的,但是视频似乎开始播放,即使我没有以任何方式将它添加到视图中(我可以听到音频在背景中播放)。
有没有办法在不实际播放视频的情况下获得视频的时长和帧数?
发布于 2013-02-07 13:22:10
要获取持续时间:
NSURL *sourceMovieURL = [NSURL fileURLWithPath:somePath];
AVURLAsset *sourceAsset = [AVURLAsset URLAssetWithURL:sourceMovieURL options:nil];
CMTime duration = sourceAsset.duration;
要获取帧抓取:
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];
发布于 2013-02-07 12:48:14
使用MPMoviePlayerController调用setShouldAutoPlay:NO
可以做到这一点:
moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL: movieURL];
[moviePlayerController setShouldAutoplay:NO];
[moviePlayerController prepareToPlay];
编辑:我在没有解释的情况下被否决了,但我会坚持这个答案。如果你需要使用MPMoviePlayerController
,那么这将阻止媒体的自动播放,但仍然允许你根据我最初的问题获得持续时间和缩略图。
发布于 2021-11-23 13:43:24
使用此方法:
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)
}
}
}
}
https://stackoverflow.com/questions/14742262
复制相似问题