I am trying to change the video frame size to square i.e 100 x 100. Here is the code:
- (void) changeSize :(NSURL *) url
{
//Create audio/video Settings
NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
AVVideoCodecH264, AVVideoCodecKey,
[NSNumber numberWithInt: 100], AVVideoWidthKey,
[NSNumber numberWithInt:100], AVVideoHeightKey,
nil];
NSDictionary * audioSettings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
[NSNumber numberWithInt: 2], AVNumberOfChannelsKey,
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
[NSData data], AVChannelLayoutKey, nil];
//Read Asset
AVURLAsset *myAsset = [AVURLAsset URLAssetWithURL:url options:nil];
NSArray *videoTracks = [myAsset tracksWithMediaType:AVMediaTypeVideo];
AVAssetTrack *audioTrack = [[myAsset tracksWithMediaType:AVMediaTypeAudio]objectAtIndex:0];
AVAssetReader *assetReader = [[AVAssetReader alloc]initWithAsset:myAsset error:nil];
AVAssetReaderOutput *videoOutput = [AVAssetReaderVideoCompositionOutput assetReaderVideoCompositionOutputWithVideoTracks:videoTracks videoSettings:nil];
AVAssetReaderOutput *audioOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:audioTrack outputSettings:nil];
[assetReader addOutput:videoOutput];
[assetReader addOutput:audioOutput];
//Create writer and set its properties
AVAssetWriterInput* writerInputVideo = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo
outputSettings:videoSettings] retain];
AVAssetWriterInput* writerInputAudio = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio
outputSettings:nil] retain];
NSError *error = nil;
AVAssetWriter *writer = [[AVAssetWriter alloc]initWithURL:[NSURL fileURLWithPath:fullPath] fileType:AVFileTypeQuickTimeMovie error:&error];
[writer addInput:writerInputVideo];
[writer addInput:writerInputAudio];
//start reading/writting
[writer startWriting];
[assetReader startReading];
}
Now the problem is that when it reaches [assetReader startReading], it throws and exception saying "AVAssetReaderVideoCompositionOutput.videoComposition needs to be set".
Anybody please guide me?
TIA
I made it myself. Check it out:
- (void) resizeVideo:(NSURL *)videoPath outputPath:(NSURL *)outputPath
{
NSURL *fullPath = outputPath;
NSURL *path = videoPath;
NSLog(@"Write Started");
NSError *error = nil;
AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:fullPath fileType:AVFileTypeQuickTimeMovie error:&error];
NSParameterAssert(videoWriter);
NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
AVVideoCodecH264, AVVideoCodecKey,
[NSNumber numberWithInt:100], AVVideoWidthKey,
[NSNumber numberWithInt:100], AVVideoHeightKey,
nil];
AVAssetWriterInput* videoWriterInput = [[AVAssetWriterInput
assetWriterInputWithMediaType:AVMediaTypeVideo
outputSettings:videoSettings] retain];
NSParameterAssert(videoWriterInput);
NSParameterAssert([videoWriter canAddInput:videoWriterInput]);
videoWriterInput.expectsMediaDataInRealTime = NO;
[videoWriter addInput:videoWriterInput];
AVAsset *avAsset = [[AVURLAsset alloc] initWithURL:path options:nil];
NSError *aerror = nil;
AVAssetReader *reader = [[AVAssetReader alloc] initWithAsset:avAsset error:&aerror];
AVAssetTrack *videoTrack = [[avAsset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0];
NSDictionary *videoOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey];
AVAssetReaderTrackOutput *asset_reader_output = [[AVAssetReaderTrackOutput alloc] initWithTrack:videoTrack outputSettings:videoOptions];
[reader addOutput:asset_reader_output];
[videoWriter startWriting];
[videoWriter startSessionAtSourceTime:kCMTimeZero];
[reader startReading];
CMSampleBufferRef buffer;
while ( [reader status]==AVAssetReaderStatusReading )
{
if(![videoWriterInput isReadyForMoreMediaData])
continue;
buffer = [asset_reader_output copyNextSampleBuffer];
NSLog(@"READING");
if(buffer)
[videoWriterInput appendSampleBuffer:buffer];
NSLog(@"WRITTING...");
}
//Finish the session:
[videoWriterInput markAsFinished];
[videoWriter finishWriting];
NSLog(@"Write Ended");
}