2015-03-25 23 views
9

Tôi đang cố sửa đổi mã android-Camera2Basic để chụp một loạt ảnh. Tuy nhiên, tôi không thể nhận được sự chậm trễ giữa các hình ảnh nhanh hơn 200-300ms trên Nexus 5, chạy L 5.0.1.Chụp liên tục trên máy ảnh Android2 quá chậm

Tôi đã thử nhiều thứ, nhưng đây là cơ bản nhất. Đây là phần duy nhất của mã Camera2Basic mà tôi đã sửa đổi. Xem trước của tôi TextureView chỉ là 50x50dp, nhưng điều đó không quan trọng, phải không?

Đối với những gì đáng giá, mã này chỉ có độ trễ khoảng 50-100ms trên Nexus 6 của tôi, với L 5.1.

private void captureStillPicture() { 
    try { 
     List<CaptureRequest> captureList = new ArrayList<CaptureRequest>(); 
     mPreviewRequestBuilder.addTarget(mImageReader.getSurface()); 

     for (int i=0;i<10;i++) { 
      captureList.add(mPreviewRequestBuilder.build()); 
     } 

     mCaptureSession.stopRepeating(); 
     mCaptureSession.captureBurst(captureList, cameraCaptureCallback, null); 
     mPreviewRequestBuilder.removeTarget(mImageReader.getSurface()); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

CameraCaptureSession.CaptureCallback cameraCaptureCallback = new CameraCaptureSession.CaptureCallback() { 
    @Override 
    public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, 
      TotalCaptureResult result) { 
     Log.d("camera","saved"); 
     mPictureCounter++; 
     if (mPictureCounter >= 10) 
      unlockFocus(); 
    } 
}; 
+0

acheroncaptain Bạn có thể đính kèm mã không? Bạn đã triển khai chế độ chụp liên tục như thế nào? – user0770

Trả lời

14

Vấn đề bạn đang gặp phải là một tạo phẩm của định dạng đầu ra hình ảnh bạn đã yêu cầu. Quá trình mã hóa JPEG đặt một thời gian gian hàng lớn trên đường ống máy ảnh, do đó, có rất nhiều thời gian chết giữa khi một tiếp xúc kết thúc và tiếp theo bắt đầu trong khi mã hóa này xảy ra.

Tốc độ 30fps được trích dẫn có thể đạt được bằng cách đặt định dạng hình ảnh đầu ra trên ImageReader là YUV, vì đó là đầu ra "gốc" hơn cho máy ảnh. Đây sẽ là cách để lưu trữ các hình ảnh khi chúng được chụp, và sau đó bạn sẽ phải thực hiện mã hóa JPEG sau đó, tách riêng quá trình xử lý nội tuyến của máy ảnh.

Ví dụ: trên Nexus 5, thời gian dừng đầu ra cho mã hóa JPEG là 243ms mà bạn đang quan sát. Đối với đầu ra YUV_420_888, nó là 0ms. Tương tự như vậy, do kích thước lớn của chúng, mã hóa RAW_SENSOR giới thiệu thời gian gian hàng là 200 mili giây.

Lưu ý rằng ngay cả khi bạn loại bỏ trở ngại gian hàng bằng cách chọn định dạng "nhanh hơn", vẫn còn thời gian khung tối thiểu, tùy thuộc vào kích thước hình ảnh đầu ra. Nhưng đối với đầu ra có độ phân giải đầy đủ của Nexus 5, đây là 33ms, đó là những gì bạn mong đợi.

Thông tin có liên quan nằm trong đối tượng StreamConfigurationMap của siêu dữ liệu máy ảnh, here. Kiểm tra các phương thức getOutputStallDuration(int format, Size size)getOutputMinFrameDuration(int format, Size size) để xác nhận.

+1

YUV_420_888 chắc chắn đã làm điều đó. Cảm ơn đã giúp đỡ! – acheroncaptain

+0

Thực ra, định dạng JPEG có thể nhanh hơn YUV (hoặc RAW) trên một số thiết bị. Điều này phụ thuộc vào việc triển khai firmware của bộ mã hóa JPEG, ví dụ: [DM3730] (https://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/537/t/431683) hỗ trợ phát trực tuyến định dạng jpeg. Snapdragon 810 có thể tạo ra các ảnh chụp JPEG 16 megapixel ở 15 FPS [bằng chứng] (https://www.qualcomm.com/media/documents/files/whitepaper-breakthrough-mobile-imaging-experiences.pdf): không có cách nào để có đủ băng thông cho RAW hoặc YUV. –

-2

Dựa trên bài viết PcMag này: http://www.pcmag.com/article2/0,2817,2428017,00.asp Chế độ chụp liên tiếp Nexus 5 cho phép bạn chụp 3 ảnh mỗi giây. Vì vậy, ít hơn 333ms giữa các bức ảnh là rất khó xảy ra.

Bạn có nguồn thông tin gợi ý rằng vụ nổ Nexus 5 sẽ nhanh hơn không?

+1

Điều này dành cho API Camera2. 30 fps nên có thể với một thiết bị có khả năng ĐẦY ĐỦ. http://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#INFO_SUPPORTED_HARDWARE_LEVEL – acheroncaptain

+1

Ngoài ra, hãy xem câu hỏi này: http: // stackoverflow.com/questions/28566898/android-camera2-speed-up – acheroncaptain

+0

@acheroncaptain Vì vậy, bạn đã xác nhận rằng android.request.availableCapabilities chứa BURST_CAPTURE trên N5 của bạn? – iheanyi

5

Cố gắng thiết lập sau đây yêu cầu chụp thông số

requestBuilder = camDevice 
     .createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 

requestBuilder.set(CaptureRequest.EDGE_MODE, 
     CaptureRequest.EDGE_MODE_OFF); 
requestBuilder.set(
     CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE, 
     CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE_ON); 
requestBuilder.set(
     CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE, 
     CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE_OFF); 
requestBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE, 
     CaptureRequest.NOISE_REDUCTION_MODE_OFF); 
requestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, 
     CaptureRequest.CONTROL_AF_TRIGGER_CANCEL); 

requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true); 
requestBuilder.set(CaptureRequest.CONTROL_AWB_LOCK, true); 

Tôi không chắc chắn về thông tin nhanh như thế nào đi vào CameraCaptureSession.CaptureCallback. Nó không có dữ liệu hình ảnh và có thể được gọi trước hoặc sau ImageReader.OnImageAvailableListener. Thử đo thời gian giữa các cuộc gọi ImageReader.OnImageAvailableListener. Và đừng quên đọc hình ảnh và phát hành chúng, bởi vì hình ảnh mới không có sẵn nếu bộ đệm được lấp đầy và hình ảnh không được phát hành. Ví dụ:

private class imageAvailableListener implements 
      ImageReader.OnImageAvailableListener { 
     @Override 
     public void onImageAvailable(ImageReader ir) { 
      Log.i(TAG, "Time = " + System.currentTimeMillis()); 
      Image im = ir.acquireNextImage(); 
      im.close(); 
     } 
    } 

ImageReader mImageReader = ImageReader.newInstance(imageReaderWidth, 
        imageReaderHeight, ImageFormat.YUV_420_888, 2); 
mImageReader.setOnImageAvailableListener(
        new imageAvailableListener(), null); 
+0

Tôi nên nói rằng tôi đã sử dụng JPEG chứ không phải YUV. Đó là sự khác biệt chính trong mã của chúng tôi (mà tôi vừa nhận thấy trong phần thứ hai của câu trả lời của bạn). Vì vậy, xấu của tôi. Tôi đánh giá cao sự giúp đỡ mặc dù. – acheroncaptain

+0

LÀM VIỆC! giảm 100 ms trên thiên hà s3 - cyanogenmod 12.1 (kẹo) – Lucas

Các vấn đề liên quan