2016-08-23 3 views
0

카메라로 비디오를 녹화하는 방법을 이해하려고합니다. 그러나 녹음 시작시 항상 충돌이 발생합니다. 왜 그런 일이 벌어지고 있는지 전혀 알 수 없습니다. 지금은 미리보기를 사용할 필요가 없으며 파일에 녹음 만하면됩니다.MediaRecorder : 시작 실패 : -19

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.lexz.basiccamera"> 

    <uses-permission android:name="android.permission.CAMERA"/> 
    <uses-permission android:name="android.permission.RECORD_AUDIO"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

로그 캣 :

E/MediaRecorder: start failed: -19 
E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.lexz.basiccamera, PID: 28879 
java.lang.RuntimeException: start failed. 
at android.media.MediaRecorder.start(Native Method) 
at com.lexz.basiccamera.MainActivity$1.onClick(MainActivity.java:35) 
at android.view.View.performClick(View.java:4802) 
at android.view.View$PerformClick.run(View.java:20101) 
at android.os.Handler.handleCallback(Handler.java:810) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:189) 
at android.app.ActivityThread.main(ActivityThread.java:5529) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751) 

솔루션

적절한 작업 카메라 클래스처럼 보이는이 있어야합니다 다음 코드

public static final String TAG = "tag"; 
    Button recBut; 
    private MediaRecorder rec; 
    private Camera camera; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     releaseCamera(); 
     recBut = (Button) findViewById(R.id.rec); 

     camera = Camera.open(0); 
     prepareCamera(camera); 
     recBut.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (recBut.getText().toString().equalsIgnoreCase("start")) { 
        rec.start(); //logcat say that problem here 
        recBut.setText("RECING..."); 
       } else { 
        rec.stop(); 
        rec.reset(); 
        rec.release(); 
        rec = null; 
        recBut.setText("START"); 
        releaseCamera(); 
       } 
      } 
     }); 
    } 

    private void prepareCamera(Camera camera) { 
     List<Camera.Size> list = camera.getParameters().getSupportedVideoSizes(); 
     Log.i(TAG, "GENERAL SIZE - " + list.size()); 
     for (int i = 0; i < list.size(); i++) { 
      Log.i(TAG, "SIZE| width - " + list.get(i).width + " hight - " + list.get(i).height); 
     } 
     rec = new MediaRecorder(); 
     camera.getParameters().setRecordingHint(true); 
     rec.setCamera(camera); 
     rec.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
     rec.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
     rec.setOutputFormat(MediaRecorder.OutputFormat.WEBM); 
     rec.setVideoSize(720, 1280); 
     rec.setVideoFrameRate(24); 
     rec.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
     rec.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
     //  rec.setProfile(CamcorderProfile.get(0, CamcorderProfile.QUALITY_HIGH)); 
     rec.setOutputFile(
       Environment.getExternalStorageDirectory() + "/" + Environment.DIRECTORY_MOVIES + "/test.mp4"); 
     rec.setPreviewDisplay(null); 
     try { 
      rec.prepare(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void releaseCamera() { 
     if (camera != null) { 
      camera.release(); 
      camera = null; 
     } 
    } 
} 

매니페스트는 경우입니다 SurfaceView, SurfaceHolder 및 SurfaceHolder.Callback을 구현하고 이 surfaceview를 카메라로 설정하는 것을 잊지 마십시오. 작업 예 : check this.

답변

0
rec.setOutputFormat(MediaRecorder.OutputFormat.WEBM); 

이것은 WEBM이 포함 된 데이터입니다.

rec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
+0

아니요. 위의 내 솔루션을 확인하십시오. – Arthur

0

나를 위해 문제는 내가 카메라를 잠금 해제하지 않았다는 것이 었습니다. 카메라를 설정하기 전에 잠금을 해제하십시오.

private void prepareCamera(Camera camera) { 
    ... 
    camera.unlock();  // Unlock the camera 
    rec.setCamera(camera); 
    ...