我正在尝试为视频文件创建缩略图:
- (UIImage*) thumbnailForVideoAtURL: (NSURL*) videoURL
{
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
CGImageRef imageHandle = [generator copyCGImageAtTime:kCMTimeZero actualTime:NULL error:NULL];
if (imageHandle) {
UIImage *frameImage = [UIImage imageWithCGImage:imageHandle];
CFRelease(imageHandle);
return frameImage;
} else {
return nil;
}
}
问题在于视频文件存储在一个内容可寻址存储中,并且没有扩展名。这似乎使AVURLAsset
无法正常工作,因为该资源被创建后,在读取帧图像时会出现以下错误:
Error Domain=AVFoundationErrorDomain Code=-11828 "Cannot Open" UserInfo=0x167170 {NSLocalizedFailureReason=This media format is not supported., NSUnderlyingError=0x163a00 "The operation couldn’t be completed. (OSStatus error -12847.)", NSLocalizedDescription=Cannot Open}
这个有没有记录或者提到过呢?我不敢相信我真的被迫通过文件名传递文件格式信息。在AVURLAsset
初始化器中,options
参数看起来是提供文件类型的好地方,但是根据文档,似乎没有支持该功能。
PS. 我已经测试了代码,带有正确扩展名的同一文件可以正常生成缩略图。
[[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
对于没有扩展名的文件没有问题。 - William Entriken