gpt4 book ai didi

ios - 即使在应用旋转后,AVMutableComposition 也无法旋转视频

转载 作者:行者123 更新时间:2023-12-01 18:16:49 25 4
gpt4 key购买 nike

我正在尝试合并和裁剪一系列视频。一切正常,但生成的视频旋转了 90 度。我试图应用旋转变换,但没有任何 react 。我已经查看了至少 4 个其他线程,看看他们的解决方案是什么,而且他们几乎都在做和我一样的事情。我很茫然,知道出了什么问题吗?

- (void)merge {
if([self.scrollView.buttonArray count] == 0) {
__block UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Oops!"
message:@"No films available to fuze!"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
dispatch_async(dispatch_get_main_queue(), ^(void){

[alert show];

});
}
else {
__block UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Merging"
message:@"Films are currently fuzing!"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
dispatch_async(dispatch_get_main_queue(), ^(void){

[alert show];

});
}
AVMutableComposition *composition = [AVMutableComposition composition];


AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];

videoComposition.frameDuration = CMTimeMake(1,30);

videoComposition.renderScale = 1.0;

AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];

AVMutableVideoCompositionLayerInstruction *layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:compositionVideoTrack];

AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];


float time = 0;


for (VideoButtonView* button in self.scrollView.buttonArray) {


AVAsset *sourceAsset = button.videoAsset;

NSError *error = nil;

id videoTrack = [sourceAsset tracksWithMediaType:AVMediaTypeVideo];
id audioTrack = [sourceAsset tracksWithMediaType:AVMediaTypeAudio];

AVAssetTrack *sourceVideoTrack;
AVAssetTrack *sourceAudioTrack;

CMTime current_time = [composition duration];

if(videoTrack) {

sourceVideoTrack = [videoTrack objectAtIndex:0];
}
if(audioTrack) {
sourceAudioTrack = [audioTrack objectAtIndex:0];
}

//crop

CGSize temp = CGSizeApplyAffineTransform(sourceVideoTrack.naturalSize, sourceVideoTrack.preferredTransform);
CGSize size = CGSizeMake(fabsf(temp.width), fabsf(temp.height));
CGAffineTransform transform = sourceVideoTrack.preferredTransform;
transform = CGAffineTransformRotate(transform, M_PI_2);

videoComposition.renderSize = sourceVideoTrack.naturalSize;
if (size.width > size.height) {

[layerInstruction setTransform:transform atTime:CMTimeMakeWithSeconds(time, 30)];
} else {


float s = size.width/size.height;


CGAffineTransform new = CGAffineTransformConcat(transform, CGAffineTransformMakeScale(s,s));

float x = (size.height - size.width*s)/2;

CGAffineTransform newer = CGAffineTransformConcat(new, CGAffineTransformMakeTranslation(x, 0));

[layerInstruction setTransform:newer atTime:CMTimeMakeWithSeconds(time, 30)];
}

if(videoTrack) {
[compositionVideoTrack insertTimeRange:sourceVideoTrack.timeRange ofTrack:sourceVideoTrack atTime:current_time error:&error];
}
if(audioTrack) {
[compositionAudioTrack insertTimeRange:sourceAudioTrack.timeRange ofTrack:sourceAudioTrack atTime:current_time error:&error];
}

time += CMTimeGetSeconds(sourceVideoTrack.timeRange.duration);

}
instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction];
instruction.timeRange = compositionVideoTrack.timeRange;


videoComposition.instructions = [NSArray arrayWithObject:instruction];

NSString* documentsDirectory= [self applicationDocumentsDirectory];

NSString* myDocumentPath= [documentsDirectory stringByAppendingPathComponent:@"merge_video.mp4"];

NSURL *url = [[NSURL alloc] initFileURLWithPath: myDocumentPath];

if([[NSFileManager defaultManager] fileExistsAtPath:myDocumentPath])

{

[[NSFileManager defaultManager] removeItemAtPath:myDocumentPath error:nil];

}

AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetHighestQuality];

exporter.outputURL=url;

exporter.outputFileType = @"com.apple.quicktime-movie";

[exporter exportAsynchronouslyWithCompletionHandler:^{
BOOL success = false;
switch ([exporter status]) {
case AVAssetExportSessionStatusCompleted:
success = true;
NSLog(@"Export Completed");
break;
case AVAssetExportSessionStatusWaiting:
NSLog(@"Export Waiting");
break;
case AVAssetExportSessionStatusExporting:
NSLog(@"Export Exporting");
break;
case AVAssetExportSessionStatusFailed:
{
NSError *error = [exporter error];
NSLog(@"Export failed: %@", [error localizedDescription]);

break;
}
case AVAssetExportSessionStatusCancelled:
NSLog(@"Export canceled");

break;
default:
break;
}
if (success == true) {

ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
[assetLibrary writeVideoAtPathToSavedPhotosAlbum:url completionBlock:^(NSURL *assetURL, NSError *error){
NSError *removeError = nil;
[[NSFileManager defaultManager] removeItemAtURL:url error:&removeError];
}];
__block UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Done!"
message:@"Films have been fuzed!"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
dispatch_async(dispatch_get_main_queue(), ^(void){

[alert show];

});
}

}];
}

最佳答案

AVAssetTrack *assetVideoTrack = [asset tracksWithMediaType:AVMediaTypeVideo].lastObject;

// Grab the composition video track from AVMutableComposition you already made.
AVMutableCompositionTrack *compositionVideoTrack = [composition tracksWithMediaType:AVMediaTypeVideo].lastObject;

// Apply the original transform.
if (assetVideoTrack && compositionVideoTrack) {
[compositionVideoTrack setPreferredTransform:assetVideoTrack.preferredTransform];
}

关于ios - 即使在应用旋转后,AVMutableComposition 也无法旋转视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21291889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com