How to preserve the aspect ratio of video using AVAssetWriter
- by Satoshi Nakajima
I have a following code, which captures the video from the camera and stores it as a QuickMovie file using AVAssetWriter. It works fine, but the aspect ratio is not perfect because the width and height are hardcoded (480 x 320) in the outputSettings for AVAssetWriterInput.
I'd rather find out the aspect ratio of the source video, and specify the appropriate height (480 x aspect ratio). Does anybody know how to do it? Should I defer the creation of AssetWriterInput until the first sampleBuffer?
// set the sessionPreset to 'medium'
self.captureSession = [[AVCaptureSession alloc] init];
self.captureSession.sessionPreset = AVCaptureSessionPresetMedium;
...
// create AVCaptureVideoDataOutput
self.captureVideo = [[AVCaptureVideoDataOutput alloc] init];
NSString* formatTypeKey = (NSString*)kCVPixelBufferPixelFormatTypeKey;
self.captureVideo.videoSettings = @{
formatTypeKey:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA]
};
[self.captureVideo setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
// create an AVAssetWriter
NSError* error = nil;
self.videoWriter = [[AVAssetWriter alloc] initWithURL:url
fileType:AVFileTypeQuickTimeMovie
error:&error];
...
// create AVAssetWriterInput with specified settings
NSDictionary* compression = @{
AVVideoAverageBitRateKey:[NSNumber numberWithInt:960000],
AVVideoMaxKeyFrameIntervalKey:[NSNumber numberWithInt:1]
};
self.videoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo
outputSettings:@{
AVVideoCodecKey:AVVideoCodecH264,
AVVideoCompressionPropertiesKey:compression,
AVVideoWidthKey:[NSNumber numberWithInt:480], // required
AVVideoHeightKey:[NSNumber numberWithInt:320] // required
}];
// add it to the AVAssetWriter
[self.videoWriter addInput:self.videoInput];