5

एवीएफउंडेशन के साथ एक दूसरे के शीर्ष पर कंपोजिटिंग 2 वीडियो आपको उदाहरण के लिए अंतिम कट प्रो की तरह 2 "ट्रैक" के रूप में 2 संपत्तियों (2 वीडियो) "लिखने" की अनुमति देता है।अल्फा

सिद्धांत कहता है कि मेरे पास अल्फा के साथ एक दूसरे के शीर्ष पर 2 वीडियो हो सकते हैं, और दोनों देखें।

या तो मैं कुछ गलत कर रहा हूं, या कहीं भी एक बग है, क्योंकि निम्न परीक्षण कोड, हालांकि थोड़ा गन्दा, स्पष्ट रूप से कहता है कि मुझे 2 वीडियो देखना चाहिए, और मैं केवल एक को देखता हूं, जैसा कि यहां देखा गया है: http://lockerz.com/s/172403384 - "नीला" वर्ग IMG_1388.m4v

किसी भी कारण से, IMG_1383.MOV कभी नहीं दिखाया गया है।

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], AVURLAssetPreferPreciseDurationAndTimingKey, nil]; 
AVMutableComposition *composition = [AVMutableComposition composition]; 
CMTimeRange timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(4, 1)); 
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; 

// Track B 
NSURL *urlVideo2 = [NSURL URLWithString:@"file://localhost/Users/me/Movies/Temp/IMG_1388.m4v"]; 
AVAsset *video2 = [AVURLAsset URLAssetWithURL:urlVideo2 options:options]; 
AVMutableCompositionTrack *videoTrack2 = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:0]; 
NSArray *videoAssetTracks2 = [video2 tracksWithMediaType:AVMediaTypeVideo]; 
AVAssetTrack *videoAssetTrack2 = ([videoAssetTracks2 count] > 0 ? [videoAssetTracks2 objectAtIndex:0] : nil); 
[videoTrack2 insertTimeRange:timeRange ofTrack:videoAssetTrack2 atTime:kCMTimeZero error:&error]; 

AVMutableVideoCompositionLayerInstruction *to = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoAssetTrack2]; 
[to setOpacity:.5 atTime:kCMTimeZero]; 
[to setTransform:CGAffineTransformScale(videoAssetTrack2.preferredTransform, .5, .5) atTime:kCMTimeZero]; 

// Track A 
NSURL *urlVideo = [NSURL URLWithString:@"file://localhost/Users/me/Movies/Temp/IMG_1383.MOV"]; 
AVURLAsset *video = [AVURLAsset URLAssetWithURL:urlVideo options:options]; 
AVMutableCompositionTrack *videoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:1]; 
NSArray *videoAssetTracks = [video tracksWithMediaType:AVMediaTypeVideo]; 
AVAssetTrack *videoAssetTrack = ([videoAssetTracks count] > 0 ? [videoAssetTracks objectAtIndex:0] : nil); 
[videoTrack insertTimeRange:timeRange ofTrack:videoAssetTrack atTime:kCMTimeZero error:nil]; 

AVMutableVideoCompositionLayerInstruction *from = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoAssetTrack]; 
[from setOpacity:.5 atTime:kCMTimeZero]; 

// Video Compostion 
AVMutableVideoCompositionInstruction *transition = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
transition.backgroundColor = [[UIColor clearColor] CGColor]; 
transition.timeRange = timeRange; 
transition.layerInstructions = [NSArray arrayWithObjects:to, from, nil]; 
videoComposition.instructions = [NSArray arrayWithObjects:transition, nil]; 
videoComposition.frameDuration = CMTimeMake(1, 30); 
videoComposition.renderSize = CGSizeMake(480, 360); 


// Export 
NSURL *outputURL = [NSURL URLWithString:@"file://localhost/Users/me/Movies/Temp/export.MOV"]; 
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:[[composition copy] autorelease] presetName:AVAssetExportPresetHighestQuality]; 
[exportSession setOutputFileType:@"com.apple.quicktime-movie"]; 
exportSession.outputURL = outputURL; 
exportSession.videoComposition = videoComposition; 
[exportSession exportAsynchronouslyWithCompletionHandler:nil]; 

// Player 
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:composition]; 
playerItem.videoComposition = videoComposition; 
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; 
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; 

क्या आप कुछ गलत देख रहे हैं?

इस कोड का "लक्ष्य" कैमरा इनपुट (वीडियो 1) और ओपनजी आउटपुट (वीडियो 2) "रिकॉर्ड" करना है। मैंने उन्हें "सीधे" बफर के साथ "सीधे" लिखने की कोशिश की और यह भी असफल रहा :(एवीएफउंडेशन को बदलना मेरे विचार से कम मामूली है।

+0

हैलो @StuFF एम सी मैं संक्रमण मैं https से अपने कोड का उपयोग किया है के अनेक वीडियो मर्ज करना चाहते हैं: //gist.github

इस संशोधन करके अपने कोड है।com/stuffmc/1572592/92f48ec664f1cce80def7fd2154b8809aec00b52 लेकिन मुझे दस्तावेज़ निर्देशिका में आउटपुट फ़ाइल नहीं मिल सकती है और मैंने * djromero * उत्तर का उपयोग किया है, लेकिन यह भी काम नहीं करेगा कृपया मुझे कोई सुझाव दें। – sohil

उत्तर

0

मुझे लगता है कि आपको यह गलत लगता है।

एक वीडियो फ़ाइल में डेटा की कई धारा हो सकती है। उदाहरण के लिए, यदि यह ध्वनि वाला वीडियो है तो फ़ाइल में 2 स्ट्रीम, ऑडियो स्ट्रीम और वीडियो स्ट्रीम होगी। दूसरा उदाहरण ऑडियो ऑडियो वीडियो फ़ाइल है जिसमें 5 या अधिक ऑडियो स्ट्रीम और 1 वीडियो स्ट्रीम।

ऑडियो के साथ, अधिकांश वीडियो फ़ाइल कंटेनर प्रारूप (mov, mp4, आदि ...) 1 फ़ाइल में वीडियो की कई धाराओं का समर्थन करते हैं लेकिन असल में इसका मतलब यह नहीं है कि धाराएं कोई संबंध होगा एक दूसरे के लिए, वे सिर्फ एक ही फ़ाइल कंटेनर पर संग्रहीत हैं। यदि आप उदाहरण के लिए क्विकटाइम के साथ ऐसी फाइल खोलेंगे, तो आपको ऐसी फाइलों पर वीडियो स्ट्रीम के रूप में कई खिड़कियां मिलेंगी।

किसी भी तरह, वीडियो धाराओं को इस तरह 'मिश्रण' नहीं मिलेगा। जो आप प्राप्त करने का प्रयास कर रहे हैं वह वीडियो स्ट्रीम की सिग्नल प्रोसेसिंग से संबंधित है, और मैं वास्तव में आपको इसके बारे में अधिक पढ़ने की सलाह देता हूं।

यदि आपको वीडियो डेटा को एक साथ फ़ाइल में 'मिश्रण' करने की ज़रूरत नहीं है, तो आप MPMediaPlayers का उपयोग करके एक दूसरे पर वीडियो फ़ाइलों को प्रदर्शित करना चाहेंगे। ध्यान रखें कि वीडियो डेटा से निपटना आम तौर पर एक सीपीयू गहन समस्या है जिसे आप (कभी-कभी) आईओएस डिवाइस का उपयोग करके हल करने में सक्षम नहीं होंगे।

+0

वह स्पष्ट रूप से एक दूसरे के शीर्ष पर दो वीडियो मिश्रण करने की कोशिश कर रहा है और एक को अस्पष्टता जोड़ता है, ताकि आप अंतर्निहित वीडियो देख सकें। यदि आप रचना का सुझाव दे रहे हैं कि केवल एक वीडियो ट्रैक है, तो आप मिश्रण करने के लिए संगीतकार को दो ट्रैक कैसे जोड़ते हैं? – HPP

3

यह अच्छा लग रहा है, इस हिस्से को छोड़कर:

AVMutableVideoCompositionLayerInstruction *from = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoAssetTrack]; 
AVMutableVideoCompositionLayerInstruction *to = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoAssetTrack2]; 

आप videoTrack और videoTrack2 उपयोग करने के लिए मूल संपत्ति videoAssetTrack और videoAssetTrack2 के बजाय, परत निर्देश, जैसे कि, पटरियों composition को जोड़ा गया निर्माण करने के लिए की जरूरत है।

इसके अलावा, वीडियो को घुमाने के लिए एक रूपांतरण जोड़ना यह थोड़ा सा ट्रिकियर है (मूलभूत बातें से परे AVFoundation में कुछ भी)। मैंने अभी 2 वीडियो चलाने के लिए लाइन पर टिप्पणी की है।

NSError *error = nil; 
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], AVURLAssetPreferPreciseDurationAndTimingKey, nil]; 
AVMutableComposition *composition = [AVMutableComposition composition]; 
CMTimeRange timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(4, 1)); 
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; 

// Track B 
NSURL *urlVideo2 = [[NSBundle mainBundle] URLForResource:@"b" withExtension:@"mov"];   
AVAsset *video2 = [AVURLAsset URLAssetWithURL:urlVideo2 options:options]; 
AVMutableCompositionTrack *videoTrack2 = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:0]; 
NSArray *videoAssetTracks2 = [video2 tracksWithMediaType:AVMediaTypeVideo]; 
AVAssetTrack *videoAssetTrack2 = ([videoAssetTracks2 count] > 0 ? [videoAssetTracks2 objectAtIndex:0] : nil); 
[videoTrack2 insertTimeRange:timeRange ofTrack:videoAssetTrack2 atTime:kCMTimeZero error:&error]; 

AVMutableVideoCompositionLayerInstruction *to = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack2]; 
[to setOpacity:.5 atTime:kCMTimeZero]; 
//[to setTransform:CGAffineTransformScale(videoAssetTrack2.preferredTransform, .5, .5) atTime:kCMTimeZero]; 

// Track A 
NSURL *urlVideo = [[NSBundle mainBundle] URLForResource:@"a" withExtension:@"mov"];   
AVURLAsset *video = [AVURLAsset URLAssetWithURL:urlVideo options:options]; 
AVMutableCompositionTrack *videoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:1]; 
NSArray *videoAssetTracks = [video tracksWithMediaType:AVMediaTypeVideo]; 
AVAssetTrack *videoAssetTrack = ([videoAssetTracks count] > 0 ? [videoAssetTracks objectAtIndex:0] : nil); 
[videoTrack insertTimeRange:timeRange ofTrack:videoAssetTrack atTime:kCMTimeZero error:nil]; 

AVMutableVideoCompositionLayerInstruction *from = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack]; 
[from setOpacity:.5 atTime:kCMTimeZero]; 

// Video Compostion 
AVMutableVideoCompositionInstruction *transition = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
transition.backgroundColor = [[UIColor clearColor] CGColor]; 
transition.timeRange = timeRange; 
transition.layerInstructions = [NSArray arrayWithObjects:to, from, nil]; 
videoComposition.instructions = [NSArray arrayWithObjects:transition, nil]; 
videoComposition.frameDuration = CMTimeMake(1, 30); 
videoComposition.renderSize = composition.naturalSize; // CGSizeMake(480, 360); 
+0

मैं इसे अभी तक (आपका कोड) नहीं बना सकता, लेकिन ... मुझे लगता है कि मुझे "वीडियोट्रैक" जोड़ना होगा जो एक 'AVMutableCompositionTrack *' है जहां दस्तावेज़/शीर्षलेख स्पष्ट रूप से बताता है '- [videoCompositionLayerInstructionWithAssetTrack : (AVAssetTrack *) ट्रैक' (इसलिए पैरामीटर एक 'AVAssetTrack * 'my * videoAssetTrack * है। आपकी मदद के लिए धन्यवाद! अंत में, अंत में, मैंने अंततः" फ्रेम द्वारा फ्रेम "दोनों वीडियो बनाये" जैसा कि https पर बताया गया है : //devforums.apple.com/message/601194#601194 –

+0

AVMutableCompositionTrack AVAssetTrack का उप-वर्ग है। आपको अपनी रचना (वीडियोट्रैक और वीडियोट्रैक 2) में ट्रैक के लिए निर्देशों की आवश्यकता है, अन्यथा इसका परिणाम पर कोई प्रभाव नहीं पड़ता है। – djromero

+0

सच। * मेरे * :) वीडियो के साथ कोड मुझे '- [AVPlayerItem setVideoComposition:] वीडियो संरचना में सकारात्मक रेंडर आकार होना चाहिए हालांकि। AVPlayerLayer पर वीडियो को "दिखाने" के लिए आप किस कोड का उपयोग करते हैं? –

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