从使用 AVAssetWriter 创建的视频生成缩略图

Posted

技术标签:

【中文标题】从使用 AVAssetWriter 创建的视频生成缩略图【英文标题】:Generating thumbnails from videos created using AVAssetWriter 【发布时间】:2012-07-14 16:52:20 【问题描述】:

我正在使用AVAssetWritercaptureOutput 回调录制视频+音频。问题是在大约 5% 的情况下,我无法从第二个零生成缩略图(如果我尝试在视频中走得更远,那么就没有问题)。我得到的错误是:

错误域=AVFoundationErrorDomain 代码=-11832 “无法打开” UserInfo=0x4b31b0 NSLocalizedFailureReason=此媒体不能 used., NSUnderlyingError=0x4effb0 "操作不能 完全的。 (OSStatus 错误 -12431.)", NSLocalizedDescription=Cannot 打开

这是我正在使用的代码:

AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.appliesPreferredTrackTransform=TRUE;
[asset release];
CMTime thumbTime = CMTimeMakeWithSeconds(0,30);

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error)

    if (result != AVAssetImageGeneratorSucceeded)
    
        [self NSLogPrint:[NSString stringWithFormat:@"couldn't generate thumbnail, error:%@", error]];
    

    UIImage *thumbImg=[[UIImage imageWithCGImage:im] retain];   

    [image setImage:thumbImg];
    [thumbImg release];

    [generator release];
;

CGSize maxSize = CGSizeMake(177, 100);
generator.maximumSize = maxSize;
[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];

这是我设置视频的方法AVAssetWriterInput

- (BOOL) setupAssetWriterVideoInput:(CMFormatDescriptionRef)currentFormatDescription 

    float bitsPerPixel;
    CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(currentFormatDescription);
    int numPixels = dimensions.width * dimensions.height;
    int bitsPerSecond;

    // Assume that lower-than-SD resolutions are intended for streaming, and use a lower bitrate
    if ( numPixels < (640 * 480) )
        bitsPerPixel = 4.05; // This bitrate matches the quality produced by AVCaptureSessionPresetMedium or Low.
    else
        bitsPerPixel = 11.04; // This bitrate matches the quality produced by AVCaptureSessionPresetHigh.

    bitsPerSecond = numPixels * bitsPerPixel;

    NSDictionary *videoCompressionSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                              AVVideoCodecH264, AVVideoCodecKey,
                                              [NSNumber numberWithInteger:dimensions.width], AVVideoWidthKey,
                                              [NSNumber numberWithInteger:dimensions.height], AVVideoHeightKey,
                                              [NSDictionary dictionaryWithObjectsAndKeys:
                                               [NSNumber numberWithInteger:bitsPerSecond], AVVideoAverageBitRateKey,
                                               [NSNumber numberWithInteger:30], AVVideoMaxKeyFrameIntervalKey,
                                               nil], AVVideoCompressionPropertiesKey,
                                              nil];
    if ([_videoWriter canApplyOutputSettings:videoCompressionSettings forMediaType:AVMediaTypeVideo]) 
    
        self._videoWriterInput = [[AVAssetWriterInput alloc] initWithMediaType:AVMediaTypeVideo outputSettings:videoCompressionSettings];
        self._videoWriterInput.expectsMediaDataInRealTime = YES;
        self._videoWriterInput.transform = [self returnOrientation];
        if ([_videoWriter canAddInput:self._videoWriterInput])
            [_videoWriter addInput:self._videoWriterInput];
        else
        
            NSLog(@"Couldn't add asset writer video input.");
            return NO;
        
    
    else
    
        NSLog(@"Couldn't apply video output settings.");
        return NO;
    

    return YES;

我知道这个错误意味着当时没有图像,但是为什么会出现这种情况?

我还使用 AVCaptureMovieFileOutput 测试了录制,并且始终会生成缩略图。 此外,如果我将视频导出到相机胶卷,照片中的预览也将不可用。

P.S:我也在某处读到这可能与关键帧间隔有关,但我不确定如何。

【问题讨论】:

【参考方案1】:

我解决了我的问题。我在 ios 4.2.1 上运行,并决定升级到 iOS 5.1.1,问题消失了。

【讨论】:

偶尔我会在 iOS 8.3 上看到这个 我在 iOS 10.3 中一直看到这一点 10.3.3也有问题

以上是关于从使用 AVAssetWriter 创建的视频生成缩略图的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 AVAssetWriter 完全裁剪视频?

使用 AVAssetWriter 将大量图像写入视频文件时的高峰值内存使用率

AVAssetWriter视频数据编码

如何对 AVAssetWriter 输出进行颜色管理

AVAssetWriter - 设置自定义帧率

为啥使用 AVCaptureSession、AVAssetWriter 和 AVPlayer 录制和回放视频会卡顿?