2013-04-08 7 views
11

मैं अपने आईओएस डिवाइस पर अपलोड करने से पहले वीडियो घुमाने का प्रयास कर रहा हूं क्योंकि अन्य प्लेटफ़ॉर्म (जैसे एंड्रॉइड) आईओएस रिकॉर्ड किए गए वीडियो में रोटेशन जानकारी की सही व्याख्या नहीं करते हैं और परिणामस्वरूप, खेलें उन्हें अनुचित रूप से घुमाया गया।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 डिग्री से सफलतापूर्वक क्यों घुमाएगी?

+0

मुझे आपके जैसी ही समस्याएं हैं, और नीचे दिए गए सुझाए गए उत्तर (उदाहरण के लिए AVAssetExportPresetMediumQuality में बदलना) समस्या का समाधान नहीं करता है। मैंने परत इनपुट पर सेटऑपेसिटी: 0 जोड़ने की कोशिश की, लेकिन ऐसा लगता है कि फिल्म निर्यात करते समय निर्देशों को अनदेखा किया जाता है। –

+0

मुझे भी एक ही समस्या है, क्या आपको कोई समाधान मिला? – user3306145

उत्तर

6

क्योंकि आप AVAssetExportPresetPassthrough का उपयोग कर रहे हैं AVAssetExportSessionvideoComposition को अनदेखा कर देगा, किसी भी अन्य प्रीसेट का उपयोग करें।

+0

यह अब कोई फर्क नहीं पड़ता है। –

संबंधित मुद्दे