मैं अपने आईओएस डिवाइस पर अपलोड करने से पहले वीडियो घुमाने का प्रयास कर रहा हूं क्योंकि अन्य प्लेटफ़ॉर्म (जैसे एंड्रॉइड) आईओएस रिकॉर्ड किए गए वीडियो में रोटेशन जानकारी की सही व्याख्या नहीं करते हैं और परिणामस्वरूप, खेलें उन्हें अनुचित रूप से घुमाया गया।AVAssetExportSession वीडियो को अनदेखा करना कॉम्पोजिशन रोटेशन और स्ट्रिपिंग मेटाडाटा
मैं निम्नलिखित ढेर पदों पर ध्यान दिया है, लेकिन सफलता नहीं पड़ा है मेरे मामले को उनमें से किसी को लागू करें:
मैं Apple AVSimpleEditor परियोजना नमूना सामना, लेकिन दुर्भाग्य से सभी कभी ऐसा होता है कि एक AVAssetExportSession बनाने और exportAsynchronouslyWithCompletionHandler बुला की बात है, है, कोई रोटेशन किया जाता है, और क्या बदतर है, रोटेशन मेटाडाटा जिसके परिणामस्वरूप से बाहर छीन लिया है फ़ाइल।
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:[_mutableComposition copy] presetName:AVAssetExportPresetPassthrough];
exportSession.outputURL = outputURL;
exportSession.outputFileType = AVFileType3GPP;
exportSession.shouldOptimizeForNetworkUse = YES;
exportSession.videoComposition = _mutableVideoComposition;
[exportSession exportAsynchronouslyWithCompletionHandler:^(void)
{
NSLog(@"Status is %d %@", exportSession.status, exportSession.error);
handler(exportSession);
[exportSession release];
}];
मूल्यों _mutableComposition और _mutableVideoComposition इस विधि यहाँ से प्रारंभ कर रहे हैं:
- (void) getVideoComposition:(AVAsset*)asset
{
AVMutableComposition *mutableComposition = nil;
AVMutableVideoComposition *mutableVideoComposition = nil;
AVMutableVideoCompositionInstruction *instruction = nil;
AVMutableVideoCompositionLayerInstruction *layerInstruction = nil;
CGAffineTransform t1;
CGAffineTransform t2;
AVAssetTrack *assetVideoTrack = nil;
AVAssetTrack *assetAudioTrack = nil;
// Check if the asset contains video and audio tracks
if ([[asset tracksWithMediaType:AVMediaTypeVideo] count] != 0) {
assetVideoTrack = [asset tracksWithMediaType:AVMediaTypeVideo][0];
}
if ([[asset tracksWithMediaType:AVMediaTypeAudio] count] != 0) {
assetAudioTrack = [asset tracksWithMediaType:AVMediaTypeAudio][0];
}
CMTime insertionPoint = kCMTimeZero;
NSError *error = nil;
// Step 1
// Create a composition with the given asset and insert audio and video tracks into it from the asset
// Check whether a composition has already been created, i.e, some other tool has already been applied
// Create a new composition
mutableComposition = [AVMutableComposition composition];
// Insert the video and audio tracks from AVAsset
if (assetVideoTrack != nil) {
AVMutableCompositionTrack *compositionVideoTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:assetVideoTrack atTime:insertionPoint error:&error];
}
if (assetAudioTrack != nil) {
AVMutableCompositionTrack *compositionAudioTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [asset duration]) ofTrack:assetAudioTrack atTime:insertionPoint error:&error];
}
// Step 2
// Translate the composition to compensate the movement caused by rotation (since rotation would cause it to move out of frame)
t1 = CGAffineTransformMakeTranslation(assetVideoTrack.naturalSize.height, 0.0);
// Rotate transformation
t2 = CGAffineTransformRotate(t1, degreesToRadians(90.0));
// Step 3
// Set the appropriate render sizes and rotational transforms
// Create a new video composition
mutableVideoComposition = [AVMutableVideoComposition videoComposition];
mutableVideoComposition.renderSize = CGSizeMake(assetVideoTrack.naturalSize.height,assetVideoTrack.naturalSize.width);
mutableVideoComposition.frameDuration = CMTimeMake(1, 30);
// The rotate transform is set on a layer instruction
instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, [mutableComposition duration]);
layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:(mutableComposition.tracks)[0]];
[layerInstruction setTransform:t2 atTime:kCMTimeZero];
// Step 4
// Add the transform instructions to the video composition
instruction.layerInstructions = @[layerInstruction];
mutableVideoComposition.instructions = @[instruction];
TT_RELEASE_SAFELY(_mutableComposition);
_mutableComposition = [mutableComposition retain];
TT_RELEASE_SAFELY(_mutableVideoComposition);
_mutableVideoComposition = [mutableVideoComposition retain];
}
मैं AVSERotateCommand from here से इस विधि खींच लिया
यहाँ कोड है कि निर्यात चलाता है। क्या कोई सुझाव दे सकता है कि यह विधि मेरे वीडियो को आवश्यक 90 डिग्री से सफलतापूर्वक क्यों घुमाएगी?
मुझे आपके जैसी ही समस्याएं हैं, और नीचे दिए गए सुझाए गए उत्तर (उदाहरण के लिए AVAssetExportPresetMediumQuality में बदलना) समस्या का समाधान नहीं करता है। मैंने परत इनपुट पर सेटऑपेसिटी: 0 जोड़ने की कोशिश की, लेकिन ऐसा लगता है कि फिल्म निर्यात करते समय निर्देशों को अनदेखा किया जाता है। –
मुझे भी एक ही समस्या है, क्या आपको कोई समाधान मिला? – user3306145