2012-08-01 106 views
4

所以我一直在爲更大的應用程序的錄音模塊。 它在大多數設備上都能正常工作,但有一批電話只是拒絕錄音。MediaRecorder「啓動失敗-12」

每當我使用MediaRecorder開始錄製時,LogCat會親切地告訴我MediaRecorder無法啓動,導致錯誤代碼爲-12。 我一直在大部分時間搜索互聯網,尋找對這些錯誤代碼的解釋。到目前爲止,我一直不走運。因此,我將自己轉向開發人員社區的其餘部分。

MediaRecorder start failed -12 

兩個以上的問題已經被問了有關這些錯誤代碼和更具體的16,19,22和一個大的離譜號碼2147483648,但該信息已被證明是在我的情況也沒用。

有誰知道我在哪裏可以找到一個可靠的MediaRecorder錯誤代碼列表,包括這些的含義?或者甚至更好,向我解釋全能的Android甲骨文試圖告訴我什麼?

在此先感謝

+0

只是一個快速評論:2147483648是2^31。不知道爲什麼API設計者會使用這個最大值。它通常是簽名整數範圍的一部分。 – darrenp 2013-02-05 18:03:42

回答

4

我以前的回答不完整。 經過更多的修補之後,我發現許多設備可能對設置非常敏感,您會認爲它是大多數設備的默認設置,但實際上有很多設備的行爲並不像您期望的那樣,並且會給您帶來很多不同您無法在互聯網上找到的錯誤代碼。這些錯誤代碼範圍從-12,-19,-21到-100等,並且大多數這些錯誤代碼可以通過使用下面的提示來解決。我會給下面發現的短名單:

HTC ChaCha的運行API 10採用H264編碼器不記錄。我使用MP4和/或H263工作,但是視頻仍然完全失真。解決方案是將相機預覽尺寸設置爲640 * 480,而不是使用Google自己的「最佳預覽」方法,該方法返回576 * 432。通過設置這個模型的例外,我能夠完美地記錄它。

The Galaxy Y running API 10嘗試使用H264進行記錄時發生崩潰。對於使用MP4編碼器的人來說這是個例外。修復。

The Galaxy Ace running API 10嘗試使用MP4記錄時崩潰返回錯誤代碼-12。使用H264編碼器爲此設備模型添加例外可解決此問題。

The Desire Z running API 10嘗試使用MP4編碼器進行記錄時發生崩潰。給我一個錯誤-100(媒體服務器死亡)。使用H264修復了這個問題。

if(API >=11){ 
     if(CamcorderProfile.hasProfile(mCamId, CamcorderProfile.QUALITY_480P)) { 
      Log.d(TAG, "API 11+ 480P"); 
      mMediaRecorder.setProfile(CamcorderProfile.get(mCamId, CamcorderProfile.QUALITY_480P)); 
      mMediaRecorder.setVideoSize(640, 480); 
      mMediaRecorder.setVideoEncodingBitRate(2000000); 
     } else { 
      Log.d(TAG, "API 11+ LOW"); 
      mMediaRecorder.setProfile(CamcorderProfile.get(mCamId, CamcorderProfile.QUALITY_LOW)); 
     } 
    } else if (API < 11 && !MODEL.equals("GT-S5830") && !MODEL.equals("vision")){ 
     mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     Log.d(TAG, "API 9 device, defaulting"); 
     mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
     mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
     mMediaRecorder.setVideoSize(640, 480); 
     mMediaRecorder.setVideoEncodingBitRate(2000000); 
    } else if ((API < 11) && MODEL.equals("GT-S5830") || MODEL.equals("vision")) { 
     //Galaxy Ace and Desire Z 
     mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); 
     mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
     mMediaRecorder.setVideoSize(640, 480); 
     mMediaRecorder.setVideoEncodingBitRate(2000000); 
    } 

我敢打賭,我會遇到更多的車型是在破解一個隱喻的痛苦,當我這樣做,我將它們添加到列表中。 綜上所述;如果遇到這些煩人的,幾乎無法解釋的錯誤代碼,請查看MediaRecorder參數。我建議不要將CamcorderProfile類用於11以下的任何API,因爲許多這些模型在使用此類高質量實例時會崩潰。 如果您的錄像機視頻文件顯示奇怪的綠色,穿過屏幕的半對角線等,請嘗試設置預覽大小以匹配錄像機的視頻大小。

Camera.Parameters param = mCamera.getParameters(); 
param.setPreviewSize(width, height); 
mCamera.setParameters(param); 
1

我已經找到了修復,以我是有這個問題。 原來並非所有設備都支持高質量錄製。我認爲這是相對的,這意味着高質量是該設備的最高質量,而不是一個常數。

所以我代替:

`mMediaRecorder.setProfile(CamcorderProfile.get(camId, CamcorderProfile.QUALITY_HIGH));` 

有:

`mMediaRecorder.setProfile(CamcorderProfile.get(camId, CamcorderProfile.QUALITY_LOW));` 

,並且解決了這一問題。現在唯一的缺陷是如何定義設備支持的最高質量,而不會使其在運行時崩潰。

+0

在某些設備上,您必須設置相機參數:「cam_mode」= 1。這是大多數三星設備和一些HTC,afaik。 – Fildor 2012-08-09 09:38:28

+0

嗯有同樣的問題,不適合我的工作。什麼previe大小你使用?也許這是相關的? – spirytus 2012-08-12 22:54:26

+0

我已經取代低質量高(完全相反),併爲我工作)大聲笑 – Nikita 2012-12-12 12:46:01

0

此代碼爲我工作:)

 camId = Main.mHelper.getFrontFacingCameraId(); 
     mCamera = Camera.open(camId); 

     Camera.Parameters param = mCamera.getParameters(); 
     param.set("cam_mode", 1);  
     mCamera.setParameters(param);