2013-07-23 7 views
11

नीचे का उपयोग करते हुए मेरे कार्य कोड की संरचना वीडियो और ऑडियो रिकॉर्ड करने के लिए है? setProfile(...) आयाम को जो भी QUALITY_HIGH देता है, को सेट करने के लिए प्रतीत होता है, लेकिन बाद में मैंने setVideoSize(...) के साथ आयाम सेट किए हैं, जो इसे ओवरराइड करता है। हालांकि, जब मैं दो कैमकॉर्डर प्रोफाइल लाइनों को हटा देता हूं, तो ऐप setVideoSize(...) पर लॉगकैट E/MediaRecorder(19526): setVideoSize called in an invalid state: 2 के साथ क्रैश हो जाता है।एंड्रॉयड MediaRecorder

2) मैं ऑडियो रिकॉर्ड कैसे नहीं करूं? दस्तावेज़ीकरण में कहा गया है कि यदि setAudioSource(...) नहीं कहा जाता है, तो कोई ऑडियो ट्रैक नहीं होगा। हालांकि, जब मैं उस रेखा को हटा देता हूं तो ऐप setProfile(...) पर लॉगकैट E/MediaRecorder(19946): try to set the audio encoder without setting the audio source first के साथ दुर्घटनाग्रस्त हो जाता है।

3) यदि मैं कैमकॉर्डरप्रोफाइल लाइनों और setAudioSource(...) लाइन दोनों को हटा देता हूं, तो यह 1 में दुर्घटनाग्रस्त हो जाता है)।

4) मैं भी लाइन

recorder.setOutputFormat(OutputFormat.DEFAULT); 
CamcorderProfile लाइनों के बजाय

जोड़ने की कोशिश की है। लेकिन अब यह perpare() पर दुर्घटनाग्रस्त हो गया है। यदि setAudioSource(...) कहा जाता है LogCat है: E/MediaRecorder(20737): audio source is set, but audio encoder is not set अगर यह LogCat है नहीं बुलाया जाता है: E/MediaRecorder(20544): video source is set, but video encoder is not set

मैं allover इंटरनेट देखा है और मैं सेटअप MediaRecorder करने का सही तरीका का एक अच्छा उदाहरण नहीं मिल सकता है। Here इसका तात्पर्य है कि एपीआई 8 के बाद आपको कैमकॉर्डर प्रोफाइल भाषा का उपयोग करना चाहिए, लेकिन ऐसा लगता है कि यह समस्याएं पैदा कर रहा है।

कोई भी मदद महान होगी! धन्यवाद!

कोड (जो जब यह काम करता है के रूप में चलाने से कम है):

recorder = new MediaRecorder(); 
recorder.setCamera(<<camera>>); 
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 

CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
recorder.setProfile(profile); 

recorder.setOutputFile(<<Path String>>); 
recorder.setVideoSize(<<Width>>, <<Height>>); 

recorder.setPreviewDisplay(<<Surface>>); 

recorder.setOrientationHint(0); 
recorder.setMaxDuration(10000); 
recorder.setOnInfoListener(this); 

try 
{ 
    recorder.prepare(); 
    recorder.start(); 
} catch ... 

उत्तर

15

मैं MediaRecorder साथ बहुत अनुभव नहीं है, लेकिन मैं कुछ संबंधित विषयों पढ़ रहा था और मैं आपके सवालों का जवाब करने की कोशिश करेंगे:

1, 3 और 4) CamcorderProfile सिर्फ संकल्प की तुलना में अधिक सेट, यह भी उत्पादन प्रारूप और एनकोडर के रूप में (दोनों ऑडियो और वीडियो) के लिए चीजों को निर्धारित करता है। आपको त्रुटि मिल रही है क्योंकि आपको शायद पर कॉल करने से पहले setOutputFormat का उपयोग करने की आवश्यकता है और यदि आप कैमकॉर्डरप्रोफाइल का उपयोग नहीं करना चाहते हैं तो आपको setVideoEncoder और setAudioEncoder पर कॉल करना होगा।

2) फिर [इस answer के अनुसार], CamcorderProfile भी इस तरह के कोडेक, बिटरेट, sampleRate, ...) के रूप में ऑडियो गुण (सेट ताकि आप इसे कॉल करने से पहले एक ऑडियो स्रोत निर्धारित करने की आवश्यकता, इसका कारण यही है ऐप दुर्घटनाग्रस्त हो गया। आप रिकॉर्ड करने के लिए नहीं करना चाहते हैं ऑडियो अगले कोड का प्रयास करें: (मैं परीक्षण नहीं लगा कि यह तो मैं वास्तव में नहीं जानता कि अगर यह काम करता है, लेकिन मैं यकीन है कि यह करता है हूँ)

recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
recorder.setVideoSize(WIDTH, HEIGHT); 
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
recorder.setOutputFile(PATH); 
recorder.setPreviewDisplay(SURFACE); 

recorder.prepare(); 
recorder.start(); 

इसके अलावा बारे में पता होना कि यदि आप कैमकॉर्डरप्रोफाइल का उपयोग नहीं करना चाहते हैं (जिसका अर्थ है कि आप केवल ऑडियो या वीडियो रिकॉर्ड करना चाहते हैं) तो आपको यह सुनिश्चित करने के लिए अतिरिक्त पैरामीटर सेट करना पड़ सकता है कि आपके पास अपनी इच्छित गुणवत्ता है। निम्नलिखित उदाहरण कोड पर एक नज़र डालें:

recorder = new MediaRecorder(); 
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 

// Following code does the same as getting a CamcorderProfile (but customizable) 
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
// Video Settings 
recorder.setVideoSize(WIDTH, HEIGHT); 
recorder.setVideoFrameRate(FRAME_RATE); 
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
recorder.setVideoEncodingBitRate(VIDEO_BITRATE); 
// Audio Settings 
recorder.setAudioChannels(AUDIO_CHANNELS); 
recorder.setAudioSamplingRate(SAMPLE_RATE); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
recorder.setAudioEncodingBitRate(AUDIO_BITRATE); 

// Customizable Settings such as: 
// recorder.setOutputFile(PATH); 
// recorder.setPreviewDisplay(SURFACE); 
// etc... 

// Prepare and use the MediaRecorder 
recorder.prepare(); 
recorder.start(); 
... 
recorder.stop(); 
recorder.reset(); 
recorder.release(); 

मुझे आशा है कि यह आपकी मदद करेगा।

+1

आप सही हैं, जैसा कि मैंने इसे पोस्ट किया है, मुझे 'setProfile()' फ़ंक्शन के लिए कोड मिला है। यह हमेशा 'setAudioEncoder()' को कॉल करता है, इसलिए यदि आप ऑडियो स्रोत सेट नहीं करते हैं तो यह क्रैश हो जाएगा। इसका उत्तर इस फ़ंक्शन की प्रतिलिपि बनाना है, इस तरह आप अभी भी 'कैमकॉर्डर प्रोफाइल' सेटिंग में निर्मित कर सकते हैं लेकिन यह भी चुन सकते हैं कि आप कौन सी सेटिंग्स सेट करना चाहते हैं (यानी ऑडियो)। धन्यवाद – jacobianism

+0

हाँ, अगर आप कैमकॉर्डर का उपयोग केवल वीडियो प्राप्त करने के लिए करना चाहते हैं तो आप भी ऐसा कर सकते हैं। आप जिस तरह से किसी भी डिवाइस के लिए उन्हें हार्डकोड किए बिना इष्टतम उपलब्ध मूल्य प्राप्त कर सकते हैं। –

+1

आपकी पोस्ट को बहुत सारे खोजने के बाद मेरा दिन बना। SetVideoEncoder और setAudioEncoder से पहले सेटविडियो आकार को सेट करना चाल था। धन्यवाद – gtsouk

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