2015-01-12 21 views
14

Tôi đã thử sử dụng API camera2. Tôi đã tải xuống mã từMáy ảnh Android 2 Api

https://developer.android.com/samples/Camera2Video/index.html để tìm hiểu cách hoạt động của mã. Nó hoạt động tốt cho đến khi tôi dừng ghi âm. Khi tôi dừng ghi nó chạy theo mã.

private void stopRecordingVideo() { 
     // UI 
     mIsRecordingVideo = false; 
     mBtn_Video.setText(R.string.record); 
     // Stop recording 
     try { 
      mMediaRecorder.stop(); 
      mMediaRecorder.reset(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     Activity activity = getActivity(); 
     if (null != activity) { 
      System.out.println("file " + getVideoFile(activity)); 
      Toast.makeText(activity, "Video saved: " + getVideoFile(activity), 
        Toast.LENGTH_SHORT).show(); 
     } 
     startPreview(); 

tại mMediaRecorder.stop(); nó ném sau lỗi

01-12 16:24:23.115 2161-2200/com.cameratwoapi E/Surface﹕ queueBuffer: error queuing buffer to SurfaceTexture, -19 
01-12 16:24:23.135 2161-2200/com.cameratwoapi E/EGL_emulation﹕ tid 2200: swapBuffers(285): error 0x3003 (EGL_BAD_ALLOC) 
01-12 16:24:23.197 2161-2200/com.cameratwoapi E/CameraDeviceGLThread-0﹕ Received exception on GL render thread: 
    java.lang.IllegalStateException: swapBuffers: EGL error: 0x3003 
      at android.hardware.camera2.legacy.SurfaceTextureRenderer.checkEglError(SurfaceTextureRenderer.java:487) 
      at android.hardware.camera2.legacy.SurfaceTextureRenderer.swapBuffers(SurfaceTextureRenderer.java:480) 
      at android.hardware.camera2.legacy.SurfaceTextureRenderer.drawIntoSurfaces(SurfaceTextureRenderer.java:681) 
      at android.hardware.camera2.legacy.GLThreadManager$1.handleMessage(GLThreadManager.java:103) 
      at android.os.Handler.dispatchMessage(Handler.java:98) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.os.HandlerThread.run(HandlerThread.java:61) 

Bất kỳ ý tưởng nào tôi đang làm sai. Tôi đã dành vài giờ nhưng không thể tìm thấy bất kỳ giải pháp nào.

Chỉnh sửa - Tôi đang sử dụng trình giả lập geneymotion. Con đường tôi đang sử dụng

tập tin /storage/emulated/0/Android/data/com.gold.cameratwoapi/files/video.mp4

Cảm ơn

+0

Lỗi EGL 0x3003 dành cho "Phân phối không đúng". Đã xảy ra sự cố trong bộ nhớ ... – shkschneider

+0

Bạn đã thử gỡ lỗi và xem cuộc gọi cụ thể nào đang gây ra các sự cố trên chưa? Ngoài ra, vì bạn có thể lưu video của mình, bạn có đảm bảo rằng bạn đã thêm quyền 'WRITE_EXTERNAL_STORAGE' vào tệp kê khai ứng dụng của mình không? – Willis

+0

Cảm ơn cả hai, @Willis tôi đã viết quyền trong tệp kê khai. Tôi đang sử dụng đường dẫn này để lưu trữ tệp /storage/emulated/0/Android/data/com.gold.cameratwoapi/files/video.mp4. Vấn đề này xảy ra tại mMediaRecorder.stop(); – user1154390

Trả lời

3

Sau khi gọi mMediaRecorder.stop() một IllegalStateException luôn ném. Tôi đã nhận thấy rằng trên các thiết bị có trạng thái thay đổi trạng thái thành lỗi, hãy gọi ngay onError() trong số CameraDevice.StateCallback.

Trong mẫu mà bạn tham chiếu, onError() đóng camera và kết thúc hoạt động, do đó, chỉ cần thay đổi onError() để mở lại camera, như thế này:

@Override 
public void onError(CameraDevice cameraDevice, int error) { 
    // mCameraOpenCloseLock.release(); 
    // cameraDevice.close(); 
    // mCameraDevice = null; 
    // Activity activity = getActivity(); 
    // if (null != activity) { 
    // activity.finish(); 
    // } 

    closeCamera(); 
    openCamera(mTextureView.getWidth(), mTextureView.getHeight()); 
} 

Nó cũng sẽ là một ý tưởng tốt để đặt một số kiểm tra trong đó để đảm bảo rằng nếu một lỗi thực sự đã xảy ra, rằng các nhận xét ra mã được gọi thay vì nhập một vòng lặp cố gắng để mở máy ảnh hơn và hơn.

Tested trên Moto G 2nd gen, với Android 5.0.2

21

Giải pháp của tôi là thay đổi khoảng trống stopRecordingVideo() như sau:

private void stopRecordingVideo() { 
// UI 
mIsRecordingVideo = false; 
mButtonVideo.setText(R.string.record); 
// Added by Ben Ning, to resolve exception issue when stop recording. 
try { 
    mPreviewSession.stopRepeating(); 
    mPreviewSession.abortCaptures(); 
} catch (CameraAccessException e) { 
    e.printStackTrace(); 
} 

// Stop recording 
mMediaRecorder.stop(); 
mMediaRecorder.reset(); 

}

Key là:

try { 
    mPreviewSession.stopRepeating(); 
    mPreviewSession.abortCaptures(); 
} catch (CameraAccessException e) { 
    e.printStackTrace(); 
} 
+0

Nó hoạt động trên dự án mỏ, nhưng bạn có thể giải thích chi tiết hơn tại sao phải ngừng xem trước hai lần trước khi đóng máy ghi? – fxp

0

Tùy thuộc vào những gì bạn đang làm với CameraCaptureSession và MediaRecorder nhưng khi bạn gọi mMediaRecorder.stop() Tôi nghĩ rằng nó đang hủy hoại bề mặt sử dụng cho phiên bản xem trước camera mà gây ra lỗi này vì tài liệu nói

Khi ghi được dừng lại, bạn sẽ phải cấu hình nó một lần nữa như thể nó vừa được xây dựng

Vì vậy nếu bạn gọi PreviewSession.abortCaptures() (mPreviewSession.stopRepeating(); là không cần thiết từ những gì tôi thu thập) nó dừng lại camera gửi ra với bề mặt máy ghi âm mà sẽ cho phép bạn ngăn chặn các MediaRecorder mà không vấn đề.

PreviewSession.abortCaptures(); không ngay lập tức ngăn chặn đầu ra máy ảnh đang thử nghiệm nên bạn có thể tìm thấy bạn cần phải gọi MediaRecorder.stop() trong onClosed() hoặc onReady() phương pháp của CameraCaptureSession.StateCallback

1
 private void stopRecordingVideo() { 
// UI 
     mIsRecordingVideo = false; 
     mButtonVideo.setText(R.string.record); 
// Added by Ben Ning, to resolve exception issue when stop recording. 
     try { 
      mPreviewSession.stopRepeating(); 
      mPreviewSession.abortCaptures(); 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 

// Stop recording 
     mMediaRecorder.stop(); 
     mMediaRecorder.reset(); 

     Activity activity = getActivity(); 
     if (null != activity) { 
      Toast.makeText(activity, "Video saved: " + getVideoFile(activity), 
        Toast.LENGTH_SHORT).show(); 
     } 
     startPreview(); 
    } 

này đang làm việc cho tôi.

0

Trong trường hợp của tôi, tôi sử dụng TimerTaskHandler. Có lỗi trực tiếp đến mMediaRecorder.stop(). Vì vậy, tôi sử dụng phương pháp này

final Handler mTimerHandler = new Handler(Looper.getMainLooper()); 

     mIsRecordingVideo = false; 
     // Stop recording 
     try { 
      mPreviewSession.stopRepeating(); 
      mPreviewSession.abortCaptures(); 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 
     try{ 
      Timer timer = new Timer(); 
      TimerTask timerTask = new TimerTask() { 
       @Override 
       public void run() { 
        mTimerHandler.post(new Runnable() { 
         @Override 
         public void run() { 

          mMediaRecorder.stop(); 
          mMediaRecorder.reset(); 
         } 

        }); 
       } 
      }; 
      timer.schedule(timerTask,30); 
     }catch(RuntimeException e){ 
      Log.e("----------------","---->>>>>>>>>"+e); 
      e.printStackTrace(); 
     } 
Các vấn đề liên quan