4

我試圖改變的視頻幀大小方即,100×100這裏的視頻幀大小的代碼:改變使用AVFoundation

- (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]; 

} 

現在的問題是,當它到達[assetReader startReading]它會拋出異常並顯示「需要設置AVAssetReaderVideoCompositionOutput.videoComposition」。

有人請指導我嗎?

TIA

回答

8

嗨我自己做的。檢查出來:

- (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"); 

}