से है। मैं .mov वीडियो को .mp4 में परिवर्तित करने की कोशिश कर रहा हूं और साथ ही उन्मुखीकरण को सही करता हूं। कोड मैं नीचे का उपयोग महान काम करता है जब एक वीडियो तथापि UIImagePickerController
का उपयोग कर रिकॉर्डिंग वीडियो कैमरा रोल मैं इस त्रुटि मिलती है से चयन किया जाता है, तो और मैं देख रहा हूँ क्यों नहीं:AVAssetExportSession रोटेशन त्रुटि तब होती है जब वीडियो कैमरा रोल
निर्यात असफल: ऑपरेशन रूका: त्रुटि डोमेन = AVFoundationErrorDomain कोड = -11,841 "ऑपरेशन रूका" UserInfo = 0x1815ca50, {NSLocalizedDescription = कार्यवाही रोक दी, NSLocalizedFailureReason = वीडियो बना नहीं जा सका।}
मैं पहली बार एक और फाइल करने के लिए वीडियो को बचाने की कोशिश की है लेकिन इससे कोई फर्क नहीं पड़ता।
- (void)convertVideoToLowQuailtyAndFixRotationWithInputURL:(NSURL*)inputURL handler:(void (^)(NSURL *outURL))handler
{
if ([[inputURL pathExtension] isEqualToString:@"MOV"])
{
NSURL *outputURL = [inputURL URLByDeletingPathExtension];
outputURL = [outputURL URLByAppendingPathExtension:@"mp4"];
AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:inputURL options:nil];
AVAssetTrack *sourceVideoTrack = [[avAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVAssetTrack *sourceAudioTrack = [[avAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
AVMutableComposition* composition = [AVMutableComposition composition];
AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo
preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration)
ofTrack:sourceVideoTrack
atTime:kCMTimeZero error:nil];
[compositionVideoTrack setPreferredTransform:sourceVideoTrack.preferredTransform];
AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio
preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration)
ofTrack:sourceAudioTrack
atTime:kCMTimeZero error:nil];
AVMutableVideoComposition *videoComposition = [self getVideoComposition:avAsset];
NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];
if ([compatiblePresets containsObject:AVAssetExportPresetMediumQuality])
{
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]initWithAsset:composition presetName:AVAssetExportPresetMediumQuality];
exportSession.outputURL = outputURL;
exportSession.outputFileType = AVFileTypeMPEG4;
exportSession.shouldOptimizeForNetworkUse = YES;
exportSession.videoComposition = videoComposition;
[exportSession exportAsynchronouslyWithCompletionHandler:^{
switch ([exportSession status])
{
case AVAssetExportSessionStatusFailed:
NSLog(@"Export failed: %@ : %@", [[exportSession error] localizedDescription], [exportSession error]);
handler(nil);
break;
case AVAssetExportSessionStatusCancelled:
NSLog(@"Export canceled");
handler(nil);
break;
default:
handler(outputURL);
break;
}
}];
}
} else {
handler(inputURL);
}
}
- (AVMutableVideoComposition *)getVideoComposition:(AVAsset *)asset
{
AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVMutableComposition *composition = [AVMutableComposition composition];
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
CGSize videoSize = videoTrack.naturalSize;
BOOL isPortrait_ = [self isVideoPortrait:asset];
if(isPortrait_) {
// NSLog(@"video is portrait ");
videoSize = CGSizeMake(videoSize.height, videoSize.width);
}
composition.naturalSize = videoSize;
videoComposition.renderSize = videoSize;
videoComposition.frameDuration = CMTimeMakeWithSeconds(1/videoTrack.nominalFrameRate, 600);
AVMutableCompositionTrack *compositionVideoTrack;
compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:videoTrack atTime:kCMTimeZero error:nil];
AVMutableVideoCompositionLayerInstruction *layerInst;
layerInst = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
[layerInst setTransform:videoTrack.preferredTransform atTime:kCMTimeZero];
AVMutableVideoCompositionInstruction *inst = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
inst.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration);
inst.layerInstructions = [NSArray arrayWithObject:layerInst];
videoComposition.instructions = [NSArray arrayWithObject:inst];
return videoComposition;
}
अपने बहुत विस्तृत प्रतिक्रिया के लिए धन्यवाद। मैं अभी भी इसे काम नहीं कर सकता :( 'composable',' exportable' और 'संरक्षित सामग्री '4 जैसा आप कहते हैं। आपके पहले सुझाव से कोई त्रुटि वापस नहीं आई है। मैंने ऑडियो ट्रैक को 44,100 का उपयोग करने की कोशिश की। अगर मैं 'exportSession.videoComposition = videoComposition; पर टिप्पणी करता हूं, तो यह ठीक काम करता है हालांकि वीडियो घुमाया नहीं गया है। इसलिए समस्या कहीं और होनी चाहिए। धन्यवाद – Darren
मुझे लगता है कि आप' - AVMutableVideoComposition * में 'AVMutableComposition') बनाते हैं। getVideoComposition', और उस से 'AVMutableCompositionTrack' बनाएं। हालांकि, '- (शून्य) में परिवर्तित करें VideoToLowQuailtyAndFixRotationWithInputURL: हैंडलर: ' , आपके पास _deifferent_' AVMutableComposition' है जिसे आप' AVExportSession' पर जा रहे हैं। इस रचना को पास करने के लिए VideoComposition AVMutableCompositionTracks को बनाने के लिए, इसलिए केवल एक ही है। – jlw
मैं बस 'AVMutableVideoComposition' को 'AVMutableVideoCompositionLayerInstruction' के साथ मुख्य कन्वर्ट विधि में ले जाने का प्रयास किया, इसलिए इसमें केवल 1' AVMutableComposition' है लेकिन फिर भी वही परिणाम हैं। कैमरा रोल से वीडियो चुनते समय, इसे पार करने से पहले इसे संपीड़ित करता है, यह सुनिश्चित नहीं करता कि इससे कोई फर्क पड़ता है या नहीं। – Darren