AVAssetWriter
コールバックを使用してビデオとオーディオを録音していcaptureOutput
ます。問題は、約 5% のケースで、2 番目のゼロからサムネイルを生成できないことです (ビデオをさらに進めようとしても、問題はありません)。私が得ているエラーは次のとおりです。
Error Domain=AVFoundationErrorDomain Code=-11832 "Cannot Open" UserInfo=0x4b31b0 {NSLocalizedFailureReason=このメディアは使用できません。 }
私が使用しているコードは次のとおりです。
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 を使用して録画もテストしましたが、サムネイルは常に生成されます。また、ビデオをカメラ ロールにエクスポートすると、プレビューも写真で利用できなくなります。
PS: これはキー フレーム間隔に関係している可能性があることもどこかで読みましたが、その方法はわかりません。