2012-06-22 31 views
0

我是Android編程新手。我在android手機上完成了一個項目。它符合我的HTC渴望a8181。因爲我希望我的軟件能夠更快地工作,所以我得到了一個htc。然後該程序無法從相機獲取幀。以前有人曾經遇到過這樣的問題嗎?請幫幫我。 (我用onPreviewFrame獲得框架在我的軟件。)無法從htc one s攝像頭獲取幀,如何獲取它們?

public class CopyOfCameraPreview extends SurfaceView implements 
    SurfaceHolder.Callback, PreviewCallback { 
private SurfaceHolder mHolder; 
private Camera mCamera; 
private boolean preview = false; 
public static int w, h, l; 

public CopyOfCameraPreview1(Context context) { 
    super(context); 
    mCamera = getCameraInstance(); 
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 



public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 


    if (mHolder.getSurface() == null) { 

     return; 
    } 

    try { 
     mCamera.stopPreview(); 
     preview = false; 
    } catch (Exception e) { 

    } 

    try { 
     mCamera.setPreviewDisplay(mHolder); 
     mCamera.startPreview(); 
     preview = false; 

    } catch (Exception e) { 
     Log.d(TAG, "Error starting camera preview: " + e.getMessage()); 
    } 
} 


public void surfaceCreated(SurfaceHolder holder) { 

    try { 
     mCamera.setPreviewDisplay(holder); 
     Camera.Parameters parameters = mCamera.getParameters(); 
     parameters.setPreviewSize(960, 544); 
     parameters.setPreviewFormat(PixelFormat.YCbCr_420_SP); 

     mCamera.setParameters(parameters); 
     mCamera.setPreviewCallback(this); 

     mCamera.startPreview(); 
     preview = true; 
    } catch (IOException e) { 
     Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
    } 

} 


public void surfaceDestroyed(SurfaceHolder holder) { 
    if (mCamera != null) { 

     if (preview) { 
      mCamera.stopPreview(); 
      preview = false; 

     } 
     mCamera.release(); 
     mCamera = null; 

    } 

} 

public static Camera getCameraInstance() { 
    Camera c = null; 
    try { 
     c = Camera.open(); 
    } catch (Exception e) { 

    } 
    return c; 
} 

@Override 
public void onPreviewFrame(byte[] data, Camera camera) { 
    camera.setPreviewCallback(null); 
    if (data != null) { 
     Camera.Parameters parameters = mCamera.getParameters(); 
     int imageFormat = parameters.getPreviewFormat(); 
     if (imageFormat == ImageFormat.NV21) { 
      // Bitmap image = null; 
      w = parameters.getPreviewSize().width; 
      h = parameters.getPreviewSize().height; 
      l = data.length; 
      decodeYUV420SP(data, w, h); 
     } 

    } 

    camera.setPreviewCallback(this); 
} 

}

06-22 17:41:51.159: I/QCameraHWI(191): setPreviewWindow : X, mPreviewState = 0 
06-22 17:41:51.159: I/CameraService(191): Destroying camera 0 
06-22 17:41:51.159: I/QualcommCamera(191): Qint android::close_camera_device(hw_device_t*): device =0x14e1270 E 
06-22 17:41:51.159: I/QCameraHWI(191): ~QCameraHardwareInterface: E 
06-22 17:41:51.169: I/drawView(16359): Drwaed 
06-22 17:41:51.169: E/mm_camera_poll_thread(191): mm_camera_poll_thread_release: err, poll thread of channel 0s not running. cam_id=0 
06-22 17:41:51.169: E/mm_camera_poll_thread(191): mm_camera_poll_thread_release: err, poll thread of channel 1s not running. cam_id=0 
06-22 17:41:51.169: E/mm_camera_poll_thread(191): mm_camera_poll_thread_release: err, poll thread of channel 2s not running. cam_id=0 
06-22 17:41:51.169: E/mm_camera_poll_thread(191): mm_camera_poll_thread_release: err, poll thread of channel 3s not running. cam_id=0 
06-22 17:41:51.169: E/mm-camera(206): config_shutdown_pp Camera not in streaming mode. Returning. 
06-22 17:41:51.169: E/mm-camera(206): mctl_pp_read_pipe Got EXIT 
06-22 17:41:51.169: E/mm-camera(206): mctl_pp_clear_buf: E 
06-22 17:41:51.169: E/mm-camera(206): mctl_pp_clear_buf: Check for image mode 0 num 0 count = 0 data = 0x0 
06-22 17:41:51.169: E/mm-camera(206): mctl_pp_clear_buf: Check for image mode 1 num -1 count = -1 data = 0x0 
06-22 17:41:51.169: E/mm-camera(206): mctl_pp_clear_buf: Check for image mode 2 num 0 count = 0 data = 0x0 
06-22 17:41:51.169: E/mm-camera(206): mctl_pp_clear_buf: Check for image mode 3 num 0 count = 0 data = 0x0 
06-22 17:41:51.169: E/mm-camera(206): mctl_pp_clear_buf: Check for image mode 4 num 0 count = 0 data = 0x0 
06-22 17:41:51.169: E/mm-camera(206): mctl_pp_clear_buf: Check for image mode 5 num 0 count = 0 data = 0x0 
06-22 17:41:51.169: E/mm-camera(206): mctl_pp_clear_buf: X 
+0

沒有人可以幫助你沒有源代碼或堆棧跟蹤。 –

+0

謝謝你的建議。我把上面的代碼(我刪除了一些不需要的鱈魚)。我主要想要獲取相機的幀,然後將其從YUV轉換爲RGB,然後執行其他過程。它在舊手機上運行良好,但無法在HTC One上獲得幀。 –

+0

parameters.setPreviewSize(960,544);這句話是對的。事實上,我現在可以預覽相機,但是我無法使用onPreviewFrame獲取幀。 –

回答

0

相機預覽管理是一種有難度的 - 面視圖可用於攝像頭預覽已創建只有經過調用了surfaceChanged()。您還應該記住 停止預覽並釋放相機上的活動onPause()/ onResume()生命週期。這就是爲什麼最好將相機管理與活動相結合,而不是觀看課堂。

Nd沒有必要在onPreviewFrame()回調中查詢攝像機參數 - 它們不會因爲您的應用程序僅具有攝像頭而發生變化。

你可以看看樣品在這個項目中,它是如何工作的:

http://sourceforge.net/projects/javaocr/

(檢查出的來源,並考慮演示子目錄 - 除非你有興趣在圖像處理的東西)