2011-06-29 12 views
5

ऐप Descrtiption: स्पीडोमीटर। वीडियो पर ओवरले के रूप में सुई डायल और एनिमेटेड सुई है। मैं पोस्ट-प्रोसेसिंग के माध्यम से वीडियो पर सुई की एनीमेशन आउटपुट करता हूं। मैं AVAssetExportSession का उपयोग करता हूं, और वीडियो से वीडियो और ऑडियो ट्रैक के साथ अपनी एनिमेटेड परतों वाला एवीकंपोजिशन बनाता हूं। यह ठीक काम करता है। वीडियो शो, सुई एनिमेटेड।वास्तविक समय में वीडियो रिकॉर्डिंग में एनीमेशन को लिंक/सिंक्रनाइज़ करने के लिए

वर्तमान में पोस्ट-प्रोसेसिंग के दौरान एनीमेशन को फिर से चलाने के लिए, मैंने वीडियो के "रिकॉर्डिंग" के बाद से एक समय के साथ गति में किसी भी बदलाव को बचाया है। पोस्टप्रोकैसिंग के दौरान, फिर मैं अगली गति तक सुई को एनिमेट करने के लिए सहेजे गए समय/गति डेटा के आधार पर टाइमर को बंद कर देता हूं।

समस्या: वीडियो/एनीमेशन जोड़ी का परिणाम पूरी तरह से सटीक नहीं है और अक्सर वीडियो चलाए जाने पर गति के बीच एक मेल नहीं है और जब इसे वापस चलाया जाता है और मिश्रित किया जाता है। (आम तौर पर सुई वीडियो के अग्रिम में है) इस तथ्य के कारण कि निर्यात के दौरान कंपोजिटिंग/संपीड़न जरूरी नहीं है।

प्रश्न: क्या कोई तरीका है कि मैं रिकॉर्डिंग वीडियो स्ट्रीम में गति की जानकारी एम्बेड कर सकता हूं और फिर निर्यात किए जाने पर इसका उपयोग कर सकता हूं ताकि वीडियो और स्पीडोमीटर अस्थायी रूप से मेल खाए?

मेरे गति डेटा वाले निर्यात के दौरान विशिष्ट समय पर कॉलबैक प्राप्त करना अच्छा लगेगा।

हमेशा के रूप में ... धन्यवाद!

उत्तर

1

अपनी सुई को एनिमेट करने के लिए टाइमर का उपयोग करने के बजाए आपके द्वारा रिकॉर्ड किए गए गति डेटा के आधार पर एक कीफ्रेम एनीमेशन बनाएं।

टाइमर और सीए आमतौर पर अच्छी तरह से मिश्रण नहीं करते हैं, कम से कम जिस तरह से मैं आपके वर्णन से अनुमान लगाता हूं।

1

यदि आपको आईफोन पर ऐप चल रहा है, तो आपको मेटाडेटा एम्बेड करने की आवश्यकता है, मुझे नहीं पता कि यह कैसे करना है। यदि आप पहले एम्बेडिंग कर सकते हैं, तो HTTP LIve Streaming और HTTP लाइव स्ट्रीमिंग टूल का उपयोग करें।

मेटाडेटा id3taggenerator द्वारा फ़ाइल पर जेनरेट किया गया है, और मीडियाफिल्सेजेंटर का उपयोग करके वीडियो पर एम्बेड किया गया है। उदाहरण:

id3taggenerator -o camera1.id3 -text "Dolly camera" 
id3taggenerator -o camera2.id3 -text "Tracking camera" 

बाइनरी ऑब्जेक्ट्स सहित कई प्रकार के मेटाडेटा एम्बेड कर सकते हैं। विवरण के लिए मैन पेज का संदर्भ लें। अब हमें जेनरेट की गई फाइल को "मेटा मैक्रो-फाइल" से संदर्भित करने की आवश्यकता है।

60 id3 camera1.id3 
120 id3 camera2.id3 

पहले नंबर वीडियो, जहां आप सूचना सम्मिलित करना चाहते हैं की शुरुआत के बाद से बीते सेकंड है: यह निम्न स्वरूप के साथ एक सादा पाठ फ़ाइल है। मुझे Mediafilesegmenter कमांड को बिल्कुल याद नहीं है, क्षमा करें, आपको कम से कम मैक्रो फ़ाइल, इंडेक्स और वीडियो फ़ाइल पास करनी होगी।

परिणामी वीडियो में मेटाडेटा है जो MPMoviePlayerController द्वारा अधिसूचनाओं के रूप में पोस्ट किया गया है। विवरण के लिए यह पृष्ठ देखें: http://jmacmullin.wordpress.com/2010/11/03/adding-meta-data-to-video-in-ios/

0

इस वर्ष के डब्ल्यूडब्ल्यूडीसी से एक सत्र है जो आप जो कर रहे हैं उसके लिए एक अलग दृष्टिकोण प्रदान कर सकता है। आप यहां वीडियो देख सकते हैं: http://developer.apple.com/videos/wwdc/2011/। "AVFoundation में मीडिया के साथ काम करना" नामक एक की तलाश करें। रोचक बिट्स लगभग 26 मिनट या उससे भी कम हैं। मुझे पूरी तरह से यकीन नहीं है कि मैं समस्या को समझता हूं, लेकिन जब मैंने इसे पढ़ा, तो वह सत्र मेरे सामने हुआ।

सर्वश्रेष्ठ संबंध।

1

आपको समय से पहले अपने एनिमेशन सेट अप करने के लिए CAAnimations और StartTime प्रॉपर्टी का उपयोग करना चाहिए, फिर निर्यात करते समय उन्हें वीडियो में जोड़ने के लिए AVVideoComposition + AVVideoCompositionCoreAnimationTool का उपयोग करें। नोट इसके प्रलेखन राज्यों:

कोई भी एनिमेशन वीडियो की टाइमलाइन, नहीं वास्तविक समय पर व्याख्या की जाएगी ...

तो अपने एनिमेशन एक जैसे जहां जिसके परिणामस्वरूप फिल्म के साथ निर्दिष्ट करेगा।

1

यह सवाल थोड़ी देर हो गया है क्योंकि इस सवाल से पूछा गया था, लेकिन हर जगह देखने के बाद, मैंने रिकॉर्डिंग के दौरान वास्तविक समय में नमूना डेटा के समान कुछ करने में कामयाब रहा है (1/30 सेकेंड पर। एक वीडियो के लिए टाइमर के साथ 30fps) और इसे एक सरणी में संग्रहित करना। फिर पोस्ट-प्रोसेसिंग में, मैं सरणी में प्रत्येक डेटा तत्व के लिए लूप में एकाधिक कैलियर बना देता हूं और प्रत्येक परत पर उस डेटा के विज़ुअलाइजेशन को आकर्षित करता हूं।

प्रत्येक परत में एक CAAnimation है जो स्टार्टटाइम विशेषता के साथ सही मीडिया टाइमलाइन पर अस्पष्टता में फीका है, जो कि केवल 1/30 सेकेंड है। सरणी सूचकांक द्वारा गुणा किया गया। यह इतना समय है कि परत पहले से आगे की परत पर दिखाई देती है। यदि परत पृष्ठभूमि अपारदर्शी है, तो यह पिछले परत में प्रदान की गई सुई को अस्पष्ट कर देगी और इसलिए मूल वीडियो कैप्चर के साथ बहुत अच्छी सिंक में सुई को एनिमेट करने लगती है। आपको समय को थोड़ा सा ट्विक करना पड़ सकता है लेकिन मैं एक से अधिक फ्रेम आउट नहीं हूं।

/******** this has not been compiled but you should get the idea ************ 

// Before starting the AVAssetExportSession session and after the AVMutableComposition routine 

CALayer* speedoBackground = [[CALayer alloc] init]; // background layer for needle layers 
[speedoBackground setFrame:CGRectMake(x,y,width,height)]; // size and location 
[speedoBackground setBackgroundColor:[[UIColor grayColor] CGColor]]; 
[speedoBackground setOpacity:0.5] // partially see through on video 

// loop through the data 
for (int index = 0; index < [dataArray count]; index++) { 

    CALayer* speedoNeedle = [[CALayer alloc] init]; // layer for needle drawing 
    [speedoNeedle setFrame:CGRectMake(x,y,width,height)]; // size and location 
    [speedoNeedle setBackgroundColor:[[UIColor redColor] CGColor]]; 
    [speedoNeedle setOpacity:1.0]; // probably not needed 

    // your needle drawing routine for each data point ... e.g. 
    [self drawNeedleOnLayer:speedoNeedle angle:[self calculateNeedleAngle[dataArray objectAtIndex:index]]]; 

    CABasicAnimation *needleAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
    needleAnimation.fromValue = [NSNumber numberWithFloat:(float)0.0]; 
    needleAnimation.toValue = [NSNumber numberWithFloat:(float)1.0]; // fade in 
    needleAnimation.additive = NO; 
    needleAnimation.removedOnCompletion = NO; // it obscures previous layers 
    needleAnimation.beginTime = index*animationDuration; 
    needleAnimation.duration = animationDuration -.03; // it will not animate at this speed but layer will appear immediately over the previous layer at the correct media time 
    needleAnimation.fillMode = kCAFillModeBoth; 
    [speedoNeedle addAnimation:needleAnimation forKey:nil]; 
    [speedoBackground addSublayer:needleOverlay]; 
} 

[parentLayer addSublayer:speedoBackground]; 

. 
. 
. 
// when the AVAssetExportSession has finished, make sure you clear all the layers 
parentLayer.sublayers = nil; 

यह प्रोसेसर और मेमोरी गहन है, इसलिए यह लंबे वीडियो या जटिल ड्राइंग के लिए बहुत अच्छा नहीं है। मुझे यकीन है कि और अधिक सुरुचिपूर्ण तरीके हैं लेकिन यह काम करता है और मुझे आशा है कि इससे मदद मिलती है।

+0

हम वीडियो पर एनीमेशन या संक्रमण प्रभाव कैसे जोड़ते हैं, हमने छवियों से वीडियो बनाया है, क्या आप जानते हैं कि हम कैसे प्रभाव डालते हैं। हमने छवि बनाने के लिए https://github.com/caferrara/img-to-video का उपयोग किया वीडियो । –

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