2010-11-13 11 views
7

के साथ एकत्रित वीडियो के अभिविन्यास को नियंत्रित करने के लिए मैं पोर्ट्रेट मोड में आईफोन पर फिल्माए गए वीडियो क्लिप का एक समूह जोड़ रहा हूं। उन्हें इकट्ठा करने के लिए मैं स्पष्ट दृष्टिकोण के रूप में इस ले रहा हूँ:AVMutableComposition

AVURLAsset विभिन्न वीडियो तो एक AVMutableCompositionTrack में इन धकेल कर और फिर एक AVMutableComposition जो मैं AVAssetExportSession

साथ

फाइल करने के लिए निर्यात कर रहा हूँ में इस डालने की पकड़ पाने के लिए मेरे समस्या यह है कि जब मैं UIWebView में वीडियो प्रदर्शित करने के लिए आता हूं, तो यह लैंडस्केप मोड में दिखाई दे रहा है। हालांकि, अगर मैं किसी भी घटक दृश्य को देखता हूं तो वे पोर्ट्रेट दृश्य में दिखाई देते हैं। क्या किसी को पता है कि अभिविन्यास को कैसे हल किया जाए। मैंने AVMutableComposition प्राकृतिक आकार के साथ चारों ओर गड़बड़ करने की कोशिश की, चौड़ाई और ऊंचाई को चारों ओर बदल दिया, लेकिन यह सिर्फ मेरे लोगों को छोटा और मोटा दिखता है! (जबकि उनकी तरफ) कोई विचार/सुझाव

ट्यूडर

+0

किसी को भी पता है कि मूल उन्मुखीकरण संग्रहीत किया जाता है: यदि आप चाहते है कि आप वीडियो उन्मुखीकरण आप इस तरह AVAssetTrack से AVMutableCompositionTrack prefferedTransition मान देना चाहते हैं हो सकता है की रक्षा है? – Tudor

+0

एसेट ट्रैक पर एक मूल ट्रान्सफॉर्म प्रॉपर्टी है जिसे आप कुछ परिस्थितियों में सेट कर सकते हैं। – Hunter

उत्तर

11

सेटअप एक वीडियो रचना के लिए पहले से

धन्यवाद कि + पैमाने बारी बारी से संभाल लेंगे:

AVMutableVideoComposition* videoComposition = [[AVMutableVideoComposition videoComposition]retain]; 
videoComposition.renderSize = CGSizeMake(320, 240); 
videoComposition.frameDuration = CMTimeMake(1, 30); 

AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30)); 

AVMutableVideoCompositionLayerInstruction* rotator = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]]; 
CGAffineTransform translateToCenter = CGAffineTransformMakeTranslation(0,-320);  
CGAffineTransform rotateBy90Degrees = CGAffineTransformMakeRotation(M_PI_2); 
CGAffineTransform shrinkWidth = CGAffineTransformMakeScale(0.66, 1); // needed because Apple does a "stretch" by default - really, we should find and undo apple's stretch - I suspect it'll be a CALayer defaultTransform, or UIView property causing this 
CGAffineTransform finalTransform = CGAffineTransformConcat(shrinkWidth, CGAffineTransformConcat(translateToCenter, rotateBy90Degrees)); 
[rotator setTransform:finalTransform atTime:kCMTimeZero]; 

instruction.layerInstructions = [NSArray arrayWithObject: rotator]; 
videoComposition.instructions = [NSArray arrayWithObject: instruction]; 
+0

यदि आप सामने वाले कैमरे का उपयोग कर रहे हैं, तो आप कैमरे के ऐप में निर्मित वीडियो की तरह वीडियो को मिरर करने के लिए एक और ट्रांसफॉर्म के साथ भी आना चाहेंगे। – Hunter

+0

किस वर्ग का प्रकार 'ट्रांसफॉर्मर' है? –

+0

क्षमा करें - कॉपी/पेस्ट त्रुटि। वह लाइन अनावश्यक थी (अब हटा दी गई) – Adam

9

यहाँ कुछ कोड है कि समायोजित किया है पसंदीदा परिवर्तन का उपयोग कर घूर्णन:

// our composition, with one video and one audio track 
AVMutableComposition* composition = [AVMutableComposition composition]; 
AVMutableCompositionTrack *videoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
AVMutableCompositionTrack *audioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 

// loop through all the clips, adding them to our track and inserting composition instructions 
NSDictionary* options = @{ AVURLAssetPreferPreciseDurationAndTimingKey: @YES }; 
CMTime insertionPoint = kCMTimeZero; 
NSMutableArray* instructions = [NSMutableArray array]; 
NSError* error = nil; 
for (NSURL* outputFileURL in self.movieFileURLs) { 
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:outputFileURL options:options]; 

    // insert this clip's video track into our composition 
    NSArray *videoAssetTracks = [asset tracksWithMediaType:AVMediaTypeVideo]; 
    AVAssetTrack *videoAssetTrack = (videoAssetTracks.count > 0 ? [videoAssetTracks objectAtIndex:0] : nil); 
    [videoTrack insertTimeRange:CMTimeRangeFromTimeToTime(kCMTimeZero, asset.duration) ofTrack:videoAssetTrack atTime:insertionPoint error:&error]; 

    // create a layer instruction at the start of this clip to apply the preferred transform to correct orientation issues 
    AVMutableVideoCompositionLayerInstruction *instruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoAssetTrack]; 
    [instruction setTransform:videoAssetTrack.preferredTransform atTime:kCMTimeZero]; 

    // create the composition instructions for the range of this clip 
    AVMutableVideoCompositionInstruction * videoTrackInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
    videoTrackInstruction.timeRange = CMTimeRangeMake(insertionPoint, asset.duration); 
    videoTrackInstruction.layerInstructions = @[instruction]; 
    [instructions addObject:videoTrackInstruction]; 

    // insert this clip's audio track into our composition 
    NSArray *audioAssetTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; 
    AVAssetTrack *audioAssetTrack = (audioAssetTracks.count > 0 ? [audioAssetTracks objectAtIndex:0] : nil); 
    [audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:audioAssetTrack atTime:insertionPoint error:nil]; 

    // advance the insertion point to the end of the clip 
    insertionPoint = CMTimeAdd(insertionPoint, asset.duration); 
} 

// create our video composition which will be assigned to the player item 
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; 
videoComposition.instructions = instructions; 
videoComposition.frameDuration = CMTimeMake(1, videoTrack.naturalTimeScale); 
videoComposition.renderSize = videoTrack.naturalSize; 
_videoComposition = videoComposition; 
+1

मैं अपने एप्लिकेशन में इस कोड स्निपेट का उपयोग करने का प्रयास कर रहा हूं, जहां मैं एक वीडियो में कुछ वीडियो क्लिप मर्ज करता हूं और इसे 'AVAssetExportSession' का उपयोग करके निर्यात करता हूं। हालांकि, जब मैं 'AVAutetVideoComposition'' के उदाहरण के लिए 'AVAssetExportSession' की' VideoComposition' प्रॉपर्टी 'सेट करता हूं तो मुझे एक त्रुटि मिलती है। क्या आप फिल्म निर्यात करते समय अपने कोड का उपयोग कैसे करें? मैंने यहां एक प्रश्न बनाया है और यदि आपके पास समय है, तो क्या आप इसे देखेंगे? http://stackoverflow.com/questions/16385017/error-when-using-avassetexportsession-with-video-composition-set – simonbs

+0

@ सिमोनस क्या आप इसे काम करने में सक्षम थे? –

11

यदि सभी

AVAssetTrack *videoAssetTrack= [[videoAsset tracksWithMediaType:AVMediaTypeVideo] lastObject]; 

AVMutableCompositionTrack *videoCompositionTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
[videoCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:videoAssetTrack atTime:kCMTimeZero error:&error]; 

videoCompositionTrack.preferredTransform = videoAssetTrack.preferredTransform; 
+0

यह सबसे सुविधाजनक तरीका है। धन्यवाद! – AlexeyVMP

+2

ऐसा प्रतीत नहीं होता है कि संरचना में अलग-अलग उन्मुखताओं के साथ ट्रैक होते हैं ... –

+0

क्योंकि यह केवल अंतिम ऑब्जेक्ट है जिसे ध्यान में रखा जाता है। यह समस्या का सरलीकरण है, सभी मामलों के लिए समाधान नहीं। – Marcin

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