2013-08-01 104 views
1

我是Android的視頻錄製等高級技術的新手。我正在嘗試創建一個簡單的應用程序來記錄視頻。獲取錯誤在Android中啓動MediaRecorder時啓動失敗-160

這是下面的代碼,我用來記錄視頻。

private PrintWriter out = null; 
    private final MediaRecorder mediaRecorder = new MediaRecorder(); 
    private final Camera camera = getCameraInstance(); 
    private CameraPreview surfaceView = null; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     surfaceView = new CameraPreview(this, camera); 
     FrameLayout frameLayout = (FrameLayout)findViewById(R.id.frameLayout); 
     frameLayout.addView(surfaceView); 

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

     mediaRecorder.setCamera(camera); 
     mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); 
     mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
     mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
     mediaRecorder.setVideoSize(optimalSize.width, optimalSize.height); 
     mediaRecorder.setOutputFile("/sdcard/test.mpg"); 
    } 

而且我打電話裏面的onClick(的start()方法)按鈕

public void startRecording(View view){ 
     try { 
      mediaRecorder.start(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      releaseMediaRecorder(); 
     } catch(Exception e){ 
      e.printStackTrace(); 
      releaseMediaRecorder(); 
     } 
    } 

的方法,這是我SurfaceView代碼

/** A basic Camera preview class */ 
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private final Camera mCamera; 
    private final Context context; 

    public CameraPreview(Context context, Camera camera) { 
     super(context); 
     mCamera = camera; 
     this.context = context; 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      Log.d(this.getClass().getName(), "Error setting camera preview: " + e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     if(context instanceof MainActivity){ 
      ((MainActivity)context).stopMediaPlayer(); 
     } 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     if (mHolder.getSurface() == null){ 
      return; 
     } 
     try { 
      mCamera.stopPreview(); 
     } catch (Exception e){ 
      // ignore: tried to stop a non-existent preview 
     } 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 
      if(context instanceof MainActivity){ 
       ((MainActivity)context).prepareMediaPlayer(); 
      } 
     } catch (Exception e){ 
      Log.d(this.getClass().getName(), "Error starting camera preview: " + e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 
} 

我正在以下錯誤

08-01 16:17:39.121: I/MediaRecorderJNI(29423): prepare: surface=0x202790 (identity=1681) 
08-01 16:17:44.911: E/MediaRecorder(29423): start failed: -16 
08-01 16:17:44.911: W/System.err(29423): java.lang.RuntimeException: start failed. 
08-01 16:17:44.911: W/System.err(29423): at android.media.MediaRecorder.start(Native Method) 
08-01 16:17:44.911: W/System.err(29423): at com.sample.recorder.MainActivity.startRecording(MainActivity.java:149) 
08-01 16:17:44.911: W/System.err(29423): at java.lang.reflect.Method.invokeNative(Native Method) 
08-01 16:17:44.911: W/System.err(29423): at java.lang.reflect.Method.invoke(Method.java:507) 
08-01 16:17:44.911: W/System.err(29423): at android.view.View$1.onClick(View.java:2163) 
08-01 16:17:44.911: W/System.err(29423): at android.view.View.performClick(View.java:2552) 
08-01 16:17:44.911: W/System.err(29423): at android.view.View$PerformClick.run(View.java:9229) 
08-01 16:17:44.911: W/System.err(29423): at android.os.Handler.handleCallback(Handler.java:587) 
08-01 16:17:44.911: W/System.err(29423): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-01 16:17:44.911: W/System.err(29423): at android.os.Looper.loop(Looper.java:130) 
08-01 16:17:44.911: W/System.err(29423): at android.app.ActivityThread.main(ActivityThread.java:3701) 
08-01 16:17:44.911: W/System.err(29423): at java.lang.reflect.Method.invokeNative(Native Method) 
08-01 16:17:44.911: W/System.err(29423): at java.lang.reflect.Method.invoke(Method.java:507) 
08-01 16:17:44.911: W/System.err(29423): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
08-01 16:17:44.911: W/System.err(29423): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 
08-01 16:17:44.911: W/System.err(29423): at dalvik.system.NativeStart.main(Native Method) 
08-01 16:17:44.921: I/com.sample.recorder.MainActivity(29423): Media Recorder released successfully. 

在該錯誤代碼,當活動被加載第一線被印刷,在啓動按鈕,內部調用的startRecording()函數

權限在AndroidManifestFile

使用
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.STORAGE" /> 
+0

您是否在最後找到解決方案?我現在有同樣的問題。 – kjurkovic

+0

不,等待解決方案。 –

回答

3

好了,我已經刪除了

mediaRecorder.setVideoSize(width, height) 
設法解決這個錯誤

與Android版本的設備之前3.0(蜂巢)

這是我的代碼:這種改變它的工作原理上,我有所有的測試設備後

 mMediaRecorder.setCamera(mCamera); 

     mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { 

      mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 
      mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
      mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 

     } else { 

      if (! isFrontCamera) { 
       CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
       mMediaRecorder.setProfile(camcorderProfile); 

      } else { 
       CamcorderProfile camcorderProfile = CamcorderProfile.get(mFrontCamId, CamcorderProfile.QUALITY_LOW); 
       mMediaRecorder.setProfile(camcorderProfile); 
      } 

      mMediaRecorder.setVideoSize(720, 480); 
     } 

     mMediaRecorder.setOutputFile(filePath); 
     mMediaRecorder.setMaxDuration(60000); 
     mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface()); 

     try { 
      mMediaRecorder.prepare(); 
     } catch (IllegalStateException e) { 
      releaseMediaRecorder(); 

     } catch (IOException e) { 
      releaseMediaRecorder(); 

     } 

希望這對你也有幫助。

0

嘗試竊聽當剩餘系產生與改變:

private PrintWriter out = null; 
private final MediaRecorder mediaRecorder; 
private final Camera camera; 
private CameraPreview surfaceView = null; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mediaRecorder = new MediaRecorder(); 
    camera = getCameraInstance();} 
+1

不,仍然得到相同的錯誤:( –