2010-10-19 68 views
0

是否有可能在服務中錄製視頻,即沒有設置setPreviewDisplay? 我想它在HTC Desire的,但它是引發此信息在日誌中,在服務中錄製視頻

MediaRecorder準備失敗:-1

CameraInput沒有表面可用於顯示

有一些額外的屬性被設置? API等級1套表面 用於實時預覽:

+1

我非常懷疑它。你需要一個上下文(我認爲)。您可能會將上下文傳遞到您的服務中,但我認爲您必須調用setPreviewDisplay。你想做什麼?如果用戶不知道,我認爲您無法錄製視頻。 – Falmarri 2010-10-19 18:54:04

+0

我試圖創建一種可以在後臺錄製視頻的監視類應用,順便說一下,它允許在後臺錄製聲音! – Azlam 2010-10-19 18:58:12

回答

0

我根據由於文檔

公衆最終無效setPreviewDisplay (SurfaceHolder持有者)

相信。 預覽所需的表面爲 ,預覽爲拍攝所需的 。同樣的 表面可以重新設置而不會造成傷害。

我知道你是想拍攝視頻,但是,我把這個給我,任何相機的使用都需要一個表面。

+0

攝像頭只需要預覽即可啓動,一旦它被初始化,我認爲預覽可以被破壞,我已經看到IPWeb Cam使用這個MJPEG服務器。我仍然想要使用這個視頻來製作任何應用程序 – Azlam 2010-11-22 14:22:29

1

我在某處找到了這個片段。不知道它是否適用於媒體記錄器,但它在HTC hero android 2.1-update1(和模擬器)上的camera.takePicture工作得相當好。

if (camera == null) { 
    Log.i(TAG, "Opening camera"); 
    camera = Camera.open(); 
} 

SurfaceView view = new SurfaceView(new DummyContext()); //You'll have to create your own class extending Context 
camera.setPreviewDisplay(view.getHolder()); 
camera.startPreview(); 

//wait 
Log.i(TAG, "Wait for cam"); 
    try { 
    Thread.sleep(2000); 
} catch (InterruptedException e) { 
    Log.e(TAG, "Woken violently"); 
    e.printStackTrace(); 
} 

//take pic 
Log.i(TAG, "Take pic"); 
camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
0

公共類RecorderService延伸服務{ 私有靜態最後絃樂TAG = 「RecorderService」; 私人SurfaceView mSurfaceView; 私人SurfaceHolder mSurfaceHolder; private static Camera mServiceCamera; private boolean mRecordingStatus; private MediaRecorder mMediaRecorder; 私有文件filefolder; private String strphoto; 私人文件照片;

@Override 
public void onCreate() { 
    mRecordingStatus = false; 
    //mServiceCamera = CameraRecorder.mCamera; 
    mServiceCamera = Camera.open(); 
    mSurfaceView = CameraRecorder.mSurfaceView; 
    mSurfaceHolder = CameraRecorder.mSurfaceHolder; 

    super.onCreate(); 
    if (mRecordingStatus == false) 
     startRecording(); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onDestroy() { 
    stopRecording(); 
    mRecordingStatus = false; 

    super.onDestroy(); 
} 

public boolean startRecording(){ 
    try { 
     Toast.makeText(getBaseContext(), "Recording Started", Toast.LENGTH_SHORT).show(); 

     //mServiceCamera = Camera.open(); 
     Camera.Parameters params = mServiceCamera.getParameters(); 
     mServiceCamera.setParameters(params); 
     Camera.Parameters p = mServiceCamera.getParameters(); 

     final List<Size> listSize = p.getSupportedPreviewSizes(); 
     Size mPreviewSize = listSize.get(2); 
     Log.v(TAG, "use: width = " + mPreviewSize.width 
        + " height = " + mPreviewSize.height); 
     p.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
     p.setPreviewFormat(PixelFormat.YCbCr_420_SP); 
     mServiceCamera.setParameters(p); 

     try { 
      mServiceCamera.setPreviewDisplay(mSurfaceHolder); 
      mServiceCamera.startPreview(); 
     } 
     catch (IOException e) { 
      Log.e(TAG, e.getMessage()); 
      e.printStackTrace(); 
     } 

     mServiceCamera.unlock(); 

     mMediaRecorder = new MediaRecorder(); 
     mMediaRecorder.setCamera(mServiceCamera); 
     mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
     mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
     if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) 
     { 
      filefolder=new File(android.os.Environment.getExternalStorageDirectory(),"Backgroundcamera/videos"); 
     } 
     else 
     { 
      filefolder=RecorderService.this.getCacheDir(); 
     } 
     if(!filefolder.exists()) 
      filefolder.mkdirs(); 
     strphoto  = System.currentTimeMillis()+".mp4"; 
     mMediaRecorder.setOutputFile(filefolder+"/"+strphoto); 
     mMediaRecorder.setVideoFrameRate(30); 
     mMediaRecorder.setVideoSize(mPreviewSize.width, mPreviewSize.height); 
     mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); 

     mMediaRecorder.prepare(); 
     mMediaRecorder.start(); 

     mRecordingStatus = true; 

     return true; 
    } catch (IllegalStateException e) { 
     Log.d(TAG, e.getMessage()); 
     e.printStackTrace(); 
     return false; 
    } catch (IOException e) { 
     Log.d(TAG, e.getMessage()); 
     e.printStackTrace(); 
     return false; 
    } 
} 

public void stopRecording() { 
    Toast.makeText(getBaseContext(), "Recording Stopped", Toast.LENGTH_SHORT).show(); 
    try { 
     mServiceCamera.reconnect(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    mMediaRecorder.stop(); 
    mMediaRecorder.reset(); 

    mServiceCamera.stopPreview(); 
    mMediaRecorder.release(); 

    mServiceCamera.release(); 
    mServiceCamera = null; 
} 

} 和

開始點擊listerner服務。