2012-07-11 111 views
1

因此,我意識到MediaRecorder啓動錯誤有很多解決方案,但其中大多數都是圍繞「啓動失敗:-19」,它已鏈接到「NO_INIT」See comments in selected answer here。我還沒有找到任何解決方案,甚至沒有找到解決方案-16。MediaRecorder啓動失敗:-16

如果有人知道我在哪裏可以找到這些錯誤代碼的名稱,或者有代碼解決方案-16請將答案放在這裏!這是我正在使用的代碼。 (HTC霹靂,股票)

mr.setVideoSource(MediaRecorder.VideoSource.CAMERA); //mr is my mediaRecorder 
mr.setAudioSource(MediaRecorder.AudioSource.MIC); 
mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 
mr.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
mr.setOutputFile(ParcelFileDescriptor.fromSocket(soc).getFileDescriptor()); //soc is a java.net.ServerSocket pointing to a port on the device 

mr.setVideoSize(480,800); 
mr.setVideoFrameRate(5); 
mr.prepare(); 
mr.start(); //Crashes with "start failed: -16" 

logcat的

07-11 10:14:34.879: V/MediaRecorderJNI(17939): JNIMediaRecorderListener::setCamera 
07-11 10:14:34.879: V/MediaRecorderJNI(17939): process_media_recorder_call 
07-11 10:14:47.549: V/MediaRecorderJNI(17939): setVideoSource(1) 
07-11 10:14:47.549: V/MediaRecorderJNI(17939): getMediaRecorder E 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): setAudioSource(1) 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): setOutputFormat(0) 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): setVideoEncoder(0) 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): setAudioEncoder(0) 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): setVideoFrameRate(5) 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): setOutputFile 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): prepare 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): start 
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E 
07-11 10:14:47.639: E/MediaRecorder(17939): start failed: -16 
07-11 10:14:47.639: V/MediaRecorderJNI(17939): process_media_recorder_call 
07-11 10:14:59.290: W/dalvikvm(17939): threadid=10: thread exiting with uncaught exception (group=0x4001d5a0) 

UPDATE 12年7月11日下午2點21:Discoverd的錯誤代碼-16實際上是-EBUSY。在擴展LogCat以包含所有內容並徹底整理Android源代碼之後,我發現它與調整(初始化)相機設置的不適性有關,我不確定我做錯了什麼,但它是一個開始。如果你有權訪問AOSP,你可以看到錯誤來自/frameworks/av/media/libstagefright/CameraSource.cpp CameraSource :: ConfigureCamera

回答

2

我跑到這個錯誤(-16在開始),並找出它是由於使用不支持的分辨率造成的。

首先,你必須從支持的尺寸得到了最優規模

Parameters params = camera.getParameters(); 
     List<Size> sizes = params.getSupportedPreviewSizes(); 
     optimalSize = getOptimalPreviewSize(sizes, width, height); 
params.setPreviewSize(optimalSize.width, optimalSize.height); 

然後確保你設置預覽和錄像,以相同的尺寸(如果他們在我的經驗預覽不同將凍結時的視頻記錄啓動):用於getOptimalPreviewSize

mediaRecorder.setVideoSize(optimalSize.width, optimalSize.height); 

(示例代碼是從機器人SDK)

private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { 
    final double ASPECT_TOLERANCE = 0.1; 
    double targetRatio = (double) w/h; 
    if (sizes == null) return null; 

    Size optimalSize = null; 
    double minDiff = Double.MAX_VALUE; 

    int targetHeight = h; 

    // Try to find an size match aspect ratio and size 
    for (Size size : sizes) { 
     double ratio = (double) size.width/size.height; 
     if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; 
     if (Math.abs(size.height - targetHeight) < minDiff) { 
      optimalSize = size; 
      minDiff = Math.abs(size.height - targetHeight); 
     } 
    } 

    // Cannot find the one match the aspect ratio, ignore the requirement 
    if (optimalSize == null) { 
     minDiff = Double.MAX_VALUE; 
     for (Size size : sizes) { 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 
    } 
    return optimalSize; 
} 
+0

我仍然收到錯誤。我的問題張貼http://stackoverflow.com/questions/15964349/mediarecorder-start-failed-16-when-change-camcorderprofile-quality-low-to-camc – 2013-04-12 12:44:54

+1

「請確保您預覽和視頻都設置爲相同的大小(如果他們與我的經驗不同,預覽會在視頻記錄開始時凍結):「,這解決了我的問題,謝謝 – 2017-01-16 04:35:40