我一直在努力解决在iOS设备上捕获期间和之后控制视频方向的问题.感谢Apple之前的答案和文档,我已经能够弄明白了.但是,现在我想将一些视频推送到网站,我遇到了特殊的问题.我已经概述了这个问题,特别是
in this question,并且
the proposed solution结果要求在视频编码期间设置方向选项.
这可能是,但我不知道如何去做这件事.有关设置方向的文档是关于正确设置以便在设备上显示,我已经实现了建议found here.但是,此建议并未解决为非Apple软件(如VLC或Chrome浏览器)正确设置方向的问题. .
任何人都可以提供有关如何在设备上正确设置方向以便正确显示所有查看软件的信息吗?
解决方法
最后,基于@Aaron Vegh和@Prince的答案,我想出了我的决议:
//转换视频
//转换视频
+(void)convertMOVToMp4:(NSString *)movFilePath completion:(void (^)(NSString *mp4FilePath))block{ AVURLAsset * videoAsset = [[AVURLAsset alloc]initWithURL:[NSURL fileURLWithPath:movFilePath] options:nil]; AVAssetTrack *sourceAudioTrack = [[videoAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; AVMutableComposition* composition = [AVMutableComposition composition]; AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero,videoAsset.duration) ofTrack:sourceAudioTrack atTime:kCMTimeZero error:nil]; AVAssetExportSession * assetExport = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetMediumQuality]; NSString *exportPath = [movFilePath stringByReplacingOccurrencesOfString:@".MOV" withString:@".mp4"]; NSURL * exportUrl = [NSURL fileURLWithPath:exportPath]; assetExport.outputFileType = AVFileTypeMPEG4; assetExport.outputURL = exportUrl; assetExport.shouldOptimizeForNetworkUse = YES; assetExport.videoComposition = [self getVideoComposition:videoAsset composition:composition]; [assetExport exportAsynchronouslyWithCompletionHandler: ^(void ) { switch (assetExport.status) { case AVAssetExportSessionStatusCompleted: // export complete if (block) { block(exportPath); } break; case AVAssetExportSessionStatusFailed: block(nil); break; case AVAssetExportSessionStatusCancelled: block(nil); break; } }]; }
//获取当前方向
+(AVMutableVideoComposition *) getVideoComposition:(AVAsset *)asset composition:( AVMutableComposition*)composition{ BOOL isPortrait_ = [self isVideoPortrait:asset]; AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero,asset.duration) ofTrack:videoTrack atTime:kCMTimeZero error:nil]; AVMutableVideoCompositionLayerInstruction *layerInst = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:compositionVideoTrack]; CGAffineTransform transform = videoTrack.preferredTransform; [layerInst setTransform:transform atTime:kCMTimeZero]; AVMutableVideoCompositionInstruction *inst = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; inst.timeRange = CMTimeRangeMake(kCMTimeZero,asset.duration); inst.layerInstructions = [NSArray arrayWithObject:layerInst]; AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; videoComposition.instructions = [NSArray arrayWithObject:inst]; CGSize videoSize = videoTrack.naturalSize; if(isPortrait_) { NSLog(@"video is portrait "); videoSize = CGSizeMake(videoSize.height,videoSize.width); } videoComposition.renderSize = videoSize; videoComposition.frameDuration = CMTimeMake(1,30); videoComposition.renderScale = 1.0; return videoComposition; }
//获取视频
+(BOOL) isVideoPortrait:(AVAsset *)asset{ BOOL isPortrait = FALSE; NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo]; if([tracks count] > 0) { AVAssetTrack *videoTrack = [tracks objectAtIndex:0]; CGAffineTransform t = videoTrack.preferredTransform; // Portrait if(t.a == 0 && t.b == 1.0 && t.c == -1.0 && t.d == 0) { isPortrait = YES; } // PortraitUpsideDown if(t.a == 0 && t.b == -1.0 && t.c == 1.0 && t.d == 0) { isPortrait = YES; } // LandscapeRight if(t.a == 1.0 && t.b == 0 && t.c == 0 && t.d == 1.0) { isPortrait = FALSE; } // LandscapeLeft if(t.a == -1.0 && t.b == 0 && t.c == 0 && t.d == -1.0) { isPortrait = FALSE; } } return isPortrait;
}