2013-01-03 23 views
26

की तुलना में एक अलग पूर्वावलोकन आकार के साथ वीडियो रिकॉर्ड करें मैं उपयोगकर्ताओं को वीडियो रिकॉर्ड करने की अनुमति देने का प्रयास कर रहा हूं जो रिकॉर्डिंग के दौरान देखे जा सकने वाले वास्तविक ऑन-स्क्रीन पूर्वावलोकन से भिन्न आकार है। यह this documentation concerning the getSupportedVideoSizes function जिसमें कहा गया है से संभव हो रहा है:परिणामस्वरूप वीडियो फ़ाइल

कि लौटने सूची रिक्त नहीं है, लौट आए सूची में कम से कम एक आकार और आकार के एक लौटे सूची में MediaRecorder को भेजे जाने चाहिए शामिल होंगे। कैमरे का उपयोग वीडियो स्रोत के रूप में किया जाता है, तो कैमकॉर्डर एप्लिकेशन के लिए setVideoSize()। इस मामले में, पूर्वावलोकन का आकार वीडियो रिकॉर्डिंग के दौरान रिकॉर्ड किए गए वीडियो के संकल्प से भिन्न हो सकता है।

यह पता चलता है कि कुछ फोन इस fn से अशक्त वापस आ जाएगी (मेरे अनुभव में आकाशगंगा SIII करता है), लेकिन जो नहीं समझते हैं के लिए, यह वास्तविक वीडियो से एक अलग संकल्प के साथ एक पूर्वावलोकन प्रदान करने के लिए संभव है। क्या यह समझ सही है? क्या कुछ फोन व्यवहार और दूसरों को नहीं देते हैं?

एक समाधान का प्रयास:

official description of the setPreviewDisplay समारोह है, जो lengthy process of setting up for video recording में प्रयोग किया जाता है में, यह उल्लेख किया गया है कि: इस विधि या नहीं अशक्त सतह के साथ कहा जाता है

यदि सब पर बुलाया , मीडिया रिकॉर्डर कैमरा की पूर्वावलोकन सतह नहीं बदलेगा।

ऐसा लगता है कि मैं क्या चाहता हूं, लेकिन दुर्भाग्यवश यदि मैं ऐसा करता हूं, तो पूरी वीडियो रिकॉर्डिंग प्रक्रिया पूरी तरह से गड़बड़ हो जाती है। मुझे लगता है कि वीडियो को रिकॉर्ड करने की प्रक्रिया में इस समारोह को शून्य या पारित नहीं किया जा सकता है। शायद अन्य संदर्भों में यह ठीक है। दुर्भाग्य से हालांकि, यह मेरी मदद करने के लिए प्रतीत नहीं होता है।

मेरा एकमात्र अगला कदम TextureView एस में देखना है और एक वास्तविक सतह दृश्यवृत्ति कार्यान्वयन के विपरीत एक पूर्वावलोकन बनावट का उपयोग करने के लिए ओपनजीएल का उपयोग करने के लिए वास्तविक वांछित से अलग वांछित आकार में बनावट को फैलाने के लिए (और किसी भी फसल स्क्रीन से अधिक), और फिर सतह के लिए Surface(SurfaceTexture surfaceTexture) कन्स्ट्रक्टर के साथ setPreviewDisplay फ़ंक्शन के लिए एक सतह का निर्माण करने के लिए। मैं आईसीएस के नीचे असंगतता के कारण TextureView का उपयोग करने से बचना चाहता हूं, और यह भी क्योंकि यह महत्वपूर्ण जटिलता को जोड़ता है।

यह नाजुक प्रक्रिया की तरह लगता है, लेकिन मुझे उम्मीद है कि कोई इस क्षेत्र में कुछ सलाह दे सकता है।

धन्यवाद।

+0

क्या आप स्पष्ट कर सकते हैं कि "पूरी तरह से गड़बड़" का क्या अर्थ है? –

+0

अगर मुझे सही याद है, तो इसका मतलब था कि पूर्वावलोकन सतह काला हो गई और कुछ भी रिकॉर्ड नहीं हुआ। –

उत्तर

1

a.Assume उपयोगकर्ता एक्स के आकार, वीडियो आकार के रूप में y सेट

getSupportedVideoSizes समारोह के साथ

b.Now पूरी सूची प्राप्त करें और देखें कि एक्स, वाई उनमें से एक में गिर जाता है और सेट MediaRecorder.setVideoSize()। यदि x, y getSupportedVideoSizes सूची में नहीं आता है, तो वीडियो रिकॉर्ड के लिए डिफ़ॉल्ट प्रोफ़ाइल सेट करें।

यह वीडियो आकार

अब पूर्वावलोकन आकार, ज्यादा वैकल्पिक हल के विकल्प के लिए आने के बारे में है। एक रिलेवेटिव लेआउट लें जिसमें SurfaceView है।

<android.view.SurfaceView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/preview" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
/> 

पूर्वावलोकन SurfaceView का नाम है। यहां मैंने चौड़ाई और ऊंचाई के आधे हिस्से को फिर से आकार देने का नमूना दिया है।

resetCamera(); //reset the camera 

ViewGroup.LayoutParams params = preview.getLayoutParams(); 
RelativeLayout myRelLayout = (RelativeLayout) findViewById(R.id.myRelLayout); 
params.width = (int) (myRelLayout.getWidth()/2); 
params.height = (int)(myRelLayout.getHeight()/2); 
preview.setLayoutParams(params); 

initCamera(); //initiate the camera(open camera, set parameter, setPreviewDisplay,startPreview) 

कृपया पूर्वावलोकन के संकल्प को देखें और उसके बाद वीडियो आकार के आधार पर ऊंचाई या चौड़ाई को स्केल करें।

उम्मीद है कि यह मदद करता है।

1

जैसा कि आप उल्लेख करते हैं, यह केवल तभी संभव होता है जब समर्थित किया गया VideoVizes() एक गैर-शून्य सूची देता है।

लेकिन यदि आप एक गैर-शून्य सूची दिखाई देती है, तो इस सरल दृष्टिकोण से काम करना चाहिए:

  1. सेट setPreviewSize साथ वांछित पूर्वावलोकन संकल्प; आपके द्वारा चुने गए आकार को getSupportedPreviewSizes से दिए गए आकारों में से एक होना चाहिए।

  2. क्रमशः setPreviewDisplay या setPreviewTexture के साथ अपने भूतल दृश्य या सतह के प्रदर्शन में पूर्वावलोकन प्रदर्शन सेट करें।

  3. प्रारंभ पूर्वावलोकन।

  4. मीडिया रिकॉर्डर बनाएँ, और getSupportedVideoSizes से आकारों में से एक का उपयोग कर setVideoSize साथ या तो सीधे अपने वीडियो आकार सेट, या फिर किसी गुणवत्ता/आकार के लिए सभी मीडिया रिकॉर्डर सेटिंग्स कॉन्फ़िगर करने के लिए पूर्वनिर्धारित Camcorder profiles में से एक का उपयोग करें।

  5. कैमरा ऑब्जेक्ट को MediaRecorder के setCamera कॉल पर पास करें, बाकी मीडिया रिकॉर्डर को कॉन्फ़िगर करें, और रिकॉर्डिंग शुरू करें।

एक गैर-शून्य getSupportedVideoSizes सूची के साथ उपकरणों पर, इस संकल्प अपने setPreviewSize कॉल द्वारा निर्धारित में रहने, रिकॉर्डिंग सेट वीडियो आकार/कैमकॉर्डर प्रोफ़ाइल संकल्प पर काम के साथ पूर्वावलोकन में परिणाम चाहिए। बिना समर्थित वीडियो आकार वाले उपकरणों पर, रिकॉर्डिंग आकार से मिलान करने के लिए पूर्वावलोकन आकार MediaRecorder द्वारा रीसेट किया जाएगा। आपको बहुत कम पूर्वावलोकन रिज़ॉल्यूशन और उच्च रिकॉर्डिंग रिज़ॉल्यूशन (कहने के लिए, 160x120 पूर्वावलोकन के लिए, 720p रिकॉर्डिंग के लिए) सेट करके इसका परीक्षण करने में सक्षम होना चाहिए। यह स्पष्ट होना चाहिए कि MediaRecorder पूर्वावलोकन शुरू होने पर पूर्वावलोकन रिज़ॉल्यूशन 720p पर स्विच करता है, क्योंकि पूर्वावलोकन गुणवत्ता काफी हद तक कूद जाएगी।

ध्यान दें कि पूर्वावलोकन आकार सीधे सतह दृश्य दृश्य के आयामों से जुड़ा हुआ नहीं है; कैमरे के पूर्वावलोकन के आउटपुट को SurfaceView में फिट करने के लिए स्केल किया जाएगा, इसलिए यदि आपके SurfaceView के आयाम हैं, तो अपने लेआउट और डिवाइस के कारण 100x100 पिक्सल कहें, जो भी पूर्वावलोकन रिज़ॉल्यूशन आप उपयोग करते हैं उसे प्रदर्शित करने के लिए 100x100 तक स्केल किया जाएगा। इसलिए आपको अभी भी SurfaceView के पहलू अनुपात को सही रखने के लिए सुनिश्चित करना होगा ताकि पूर्वावलोकन विकृत न हो।

और बिजली दक्षता के लिए, आपको अपने SurfaceView में वास्तविक पिक्सेल की वास्तविक संख्या से अधिक पूर्वावलोकन रिज़ॉल्यूशन का उपयोग नहीं करना चाहिए, क्योंकि अतिरिक्त रिज़ॉल्यूशन सतह दृश्य में पूर्वावलोकन को फ़िट करने में खो जाएगा। यह निश्चित रूप से रिकॉर्डिंग के लिए संभव है जब प्राप्त किया गया है VideoSizes() एक गैर-शून्य मान देता है।

+0

मैं इसे एएसएपी से बाहर करने की कोशिश करूँगा, लेकिन वर्तमान में बहुत सारे कोड ओवरहाल के बीच में हूं और बहुत सी चीजों से गड़बड़ नहीं करना चाहता हूं। यह बहुत ही आशाजनक दिखता है (हालांकि निराशाजनक है कि 'getSupportedVideoSizes' शून्य है जैसा कि अक्सर लगता है। –

0

सबसे पहले, मैं आपके विशिष्ट प्रश्नों का उत्तर देने का प्रयास करूंगा।

  1. वास्तविक वीडियो की तुलना में एक अलग रिज़ॉल्यूशन के साथ पूर्वावलोकन प्रदान करना संभव है। क्या यह समझ सही है?

हां, पूर्वावलोकन आकार रिकॉर्डिंग आकार से अलग नहीं है। पूर्वावलोकन आकार आपके प्रदर्शन आकार से जुड़े नहीं होने की तुलना में अधिक बार होता है। तो अगर किसी फोन में सीआईएफ (352 x 288) प्रदर्शित होता है, लेकिन डी 1 (720 x 480) रिकॉर्ड करने में सक्षम है, तो पूर्वावलोकन आकार और रिकॉर्डिंग आकार अलग होगा। मुझे लगता है कि अन्य विशेषज्ञों ने इस बिंदु पर पर्याप्त उत्तर दिया है।

  1. क्या कुछ फोन व्यवहार और दूसरों को नहीं देते हैं?

अधिकांश नवीनतम फोन इस सुविधा का समर्थन करते हैं, कुछ कम अंत वाले लोगों को छोड़कर।

setPreviewDisplay के साथ, हम इस बात को भी ध्यान में रखना होगा:

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

क्या आप setPreviewDisplay पर NULL सतह के साथ आक्रमण किए गए मुद्दे को साझा कर सकते हैं?

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

  • कोई संबंधित समस्या नहीं^_^