2013-06-04 13 views
5

मुझे मीडिया रीकॉर्डर रिकॉर्डिंग वीडियो मिला है, और मैं 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 गति पर वापस चलाता है?

+0

क्यों 'QUALITY_TIME_LAPSE_480P' और' QUALITY_480P' नहीं? समय चूक अंततः 1x प्लेबैक गति नहीं है। –

+0

क्या आपने 'MediaRecorder.setVideoFrameRate' को कॉल करने में भी देखा है? –

+0

@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

उत्तर

1

, हो सकता है कि सीधे QUALITY_TIME_LAPSE_480P प्रोफ़ाइल प्रभावों प्लेबैक दरों का उपयोग

समस्या

(यह मूल प्रश्न पर टिप्पणी से संकल्प का सार है) के बाद से समय खामियों परोक्ष एक 1x नहीं हैं प्लेबैक दर।

इसके अलावा, अगर कारण आप उस प्रोफ़ाइल का उपयोग करते समय QUALITY_480P का उपयोग कर रिकॉर्ड होने से ऑडियो को रोकने के लिए है (के बाद से समय खामियों ऑडियो रिकॉर्ड नहीं है), आप के बजाय MediaRecorder पर CamcorderProfile.get(QUALITY_480P) और सेट वीडियो मापदंडों कॉल करने के लिए चाहते हो सकता है मैन्युअल रूप से MediaRecorder.setProfile पर कॉल किए बिना प्रोफ़ाइल पर आधारित है। एक MediaRecorder जिसमें कोई ऑडियो पैरामीटर सेट नहीं है, सिद्धांत में किसी ऑडियो को रिकॉर्ड नहीं करना चाहिए।

0

प्रलेखन के अनुसार, setCaptureRate(double fps) ऑडियो अनदेखा के साथ समय विलंब रिकॉर्डिंग सेट करने के लिए प्रयोग किया जाता है। यदि आप वास्तव में सिस्टम प्रदान कर सकते हैं तो कम एफपीएस चाहते हैं तो यह सबसे उपयोगी है। आप और अधिक एफपीएस से प्रणाली प्रदान कर सकते हैं पूछ सकते हैं, यहाँ developer.android.com/reference से एक उद्धरण है:

ध्यान दें कि रिकॉर्डर गारंटी नहीं दे सकते कि फ्रेम कैमरा/एनकोडर सीमाओं के कारण प्रदत्त दर पर कैप्चर हो जाएगा। हालांकि यह जितना संभव हो सके की कोशिश करता है।

आपका कोड क्या कॉल नहीं करता है, setVideoFrameRate(int rate) है। मुझे विश्वास है कि इस समारोह का उपयोग करके, आपकी रिकॉर्डिंग तय की जाएगी।

+0

दुर्भाग्यवश, यह सही नहीं है। MediaRecorder के स्रोत पर नज़र डालें: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/media/java/android/media/MediaRecorder.java setProfile (CamcorderProfile प्रोफ़ाइल) करता है कॉल सेट VideoFrameRate (profile.videoFrameRate); वहां पर टिप्पणी ने मुझे गैलेक्सी नेक्सस एस 3 पर काम करने के लिए पहली जगह सेट कैप्चररेट() को आजमाने की कोशिश की है। – spitzanator

0

आप सही हैं। मैं आपको सही उत्तर दूंगा। मुझे एक ही स्थिति का सामना करना पड़ा है। प्रारंभ विफल -22 फ्रेम दर से संबंधित है। आप जो कैप्चरिंग दर दे रहे हैं वह डिवाइस की सीमा में नहीं है। डिवाइस fps रेंज निर्धारित करने के लिए पहले getSupportedPreviewFpsRange() का उपयोग करें और फिर तदनुसार सेट करें। आप अधिकतम और न्यूनतम एफएफपीएस के लिए PREVIEW_FPS_MAX_INDEX और PREVIEW_FPS_MIN_INDEX का उपयोग कर सकते हैं। http://developer.android.com/reference/android/hardware/Camera.Parameters.html#getSupportedPreviewFpsRange()

संपादित करें: एंड्रॉयड में

निम्नलिखित कोड का उपयोग करें यह 1000 से गुणा परिणाम यानी अगर फ्रेम दर 5 है, यह अधिक जाँच के लिए यहाँ 5000.

Camera.Parameters camParameter = camera.getParameters(); 
    List<int[]> frame = camParameter.getSupportedPreviewFpsRange(); 
     Iterator<int[]> supportedPreviewFpsIterator = frame.iterator(); 
     while (supportedPreviewFpsIterator.hasNext()) { 
      int[] tmpRate = supportedPreviewFpsIterator.next(); 
      StringBuffer sb = new StringBuffer(); 
      sb.append("supportedPreviewRate: "); 
      for (int i = tmpRate.length, j = 0; j < i; j++) { 
       sb.append(tmpRate[j] + ", "); 
      } 
      Log.d(VTAG, sb.toString()); 
     } 
    } 

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

+0

आपके उत्तर के लिए धन्यवाद! आपको वास्तव में समर्थित फ़्रेमेटर्स की जांच करने की आवश्यकता है, लेकिन मैंने सत्यापित किया है कि 30fps गैलेक्सी नेक्सस एस 3 पर स्वीकार्य सीमाओं के भीतर अच्छी तरह से है, इसलिए यह मुद्दा नहीं है। – spitzanator

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