मुझे मीडिया रीकॉर्डर रिकॉर्डिंग वीडियो मिला है, और मैं setCaptureRate() के प्रभाव से बहुत उलझन में हूं।एंड्रॉइड मीडिया रिकॉर्डर सेट कैप्चररेट() और वीडियो प्लेबैक गति
विशेष रूप से, मैं अपने MediaRecorder इस प्रकार तैयार:
mMediaRecorder = new MediaRecorder();
mCamera.stopPreview();
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setProfile(CamcorderProfile.QUALITY_TIME_LAPSE_480P);
mMediaRecorder.setCaptureRate(30f);
mMediaRecorder.setOrientationHint(270);
mMediaRecorder.setOutputFile(...);
mMediaRecorder.setPreviewDisplay(...);
mMediaRecorder.prepare();
मैं पाँच सेकंड के लिए रिकॉर्ड (एक CountDownTimer साथ, लेकिन वह अप्रासंगिक है), और इस फ़ाइल उत्पन्न हो जाता है वह यह है कि:
$ ffmpeg -i ~/CaptureRate30fps.mp4
...
Seems stream 0 codec frame rate differs from container frame rate: 180000.00 (180000/1) -> 30.00 (30/1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/mspitz/CaptureRate30fps.mp4':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: isom3gp4
creation_time : 2013-06-04 00:52:00
Duration: 00:00:02.59, start: 0.000000, bitrate: 5238 kb/s
Stream #0.0(eng): Video: h264 (Baseline), yuv420p, 720x480, 5235 kb/s, PAR 65536:65536 DAR 3:2, 30 fps, 30 tbr, 90k tbn, 180k tbc
Metadata:
creation_time : 2013-06-04 00:52:00
ध्यान दें कि अवधि लगभग 3 सेकंड है। यह वीडियो भी बहुत तेज़ खेलता है, जैसे कि यह 5 सेकंड का वीडियो 3 में घुमाया गया था।
अब, अगर मैं अपने मीडिया रिकॉर्डर को ऊपर की तरह तैयार करके रिकॉर्ड करता हूं, लेकिन setCaptureRate (30f) लाइन को घटाकर, मुझे एक फ़ाइल मिलती है यह:
$ ffmpeg -i ~/NoSetCaptureRate.mp4
...
Seems stream 0 codec frame rate differs from container frame rate: 180000.00 (180000/1) -> 90000.00 (180000/2)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/mspitz/NoSetCaptureRate.mp4':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: isom3gp4
creation_time : 2013-06-04 00:50:41
Duration: 00:00:04.87, start: 0.000000, bitrate: 2803 kb/s
Stream #0.0(eng): Video: h264 (Baseline), yuv420p, 720x480, 2801 kb/s, PAR 65536:65536 DAR 3:2, 16.01 fps, 90k tbr, 90k tbn, 180k tbc
Metadata:
creation_time : 2013-06-04 00:50:41
ध्यान दें कि अवधि लगभग 5 सेकंड की अपेक्षा की जाती है। वीडियो एक सामान्य गति से भी खेलता है।
मैं setCaptureRate (30f) का उपयोग कर रहा हूं क्योंकि प्रति सेकंड 30 फ्रेम मेरे कैमकॉर्डरप्रोफाइल के videoFrameRate का मान है। मेरे गैलेक्सी नेक्सस एस 2 (4.2.1) पर, setCaptureRate() को छोड़कर ठीक है, लेकिन जब मैंने गैलेक्सी नेक्सस एस 3 (4.1.1) पर परीक्षण किया, तो setCaptureRate() को छोड़कर हमेशा सहायक "प्रारंभ विफल -22" त्रुटि में परिणाम जब मैंने mMediaRecorder.start()
कहा।
तो, मुझे क्या याद आ रही है? मैंने सोचा कि कैप्चर रेट और वीडियो फ्रेम दर स्वतंत्र थी, लेकिन यह स्पष्ट है कि वे नहीं हैं। क्या प्रोग्राम निर्धारित करने का कोई तरीका है कि मुझे कैप्चर रेट सेट करने की आवश्यकता है ताकि यह निर्धारित किया जा सके कि मेरा वीडियो 1x गति पर वापस चलाता है?
क्यों 'QUALITY_TIME_LAPSE_480P' और' QUALITY_480P' नहीं? समय चूक अंततः 1x प्लेबैक गति नहीं है। –
क्या आपने 'MediaRecorder.setVideoFrameRate' को कॉल करने में भी देखा है? –
@RomanNurik आपकी टिप्पणी के लिए धन्यवाद! मैं वास्तव में ध्वनि रिकॉर्ड नहीं करना चाहता हूं, और ऐसा करने का एकमात्र तरीका टाइम विलंब वीडियो का उपयोग करके होता है। पुन: setVideoFrameRate, जब मैं setProfile(): https://github.com/android/platform_frameworks_base/blob/master/media/java/android/media/MediaRecorder.java#L329 को कॉल करता हूं तो इसे स्रोत कहा जाता है पहली जगह में setCaptureRate() को कॉल करने की आवश्यकता के लिए मुझे क्या बंद कर दिया गया है। https://github.com/android/platform_frameworks_base/blob/master/media/java/android/media/MediaRecorder.java#L337 अन्यथा, मुझे एक -22 मिल गया। – spitzanator