Odpowiedz

6

Możesz użyć MediaRecorder bez wywoływania setAudio * na nim. To jest mój pierwszy raz przy użyciu MediaRecorder, ale ten przykład wydaje się działać:

public class CamcorderView extends SurfaceView implements 
     SurfaceHolder.Callback { 

    private SurfaceHolder mHolder; 

    private Camera mCamera; 
    private MediaRecorder mRecorder; 

    public CamcorderView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     mHolder = getHolder(); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     mHolder.addCallback(this); 

     mCamera = Camera.open(); 
     mRecorder = new MediaRecorder(); 

    } 

    public void stop() { 
     mRecorder.stop(); 
    } 

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

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     mCamera.unlock(); 
     mRecorder.setCamera(mCamera); 

     mRecorder.setPreviewDisplay(mHolder.getSurface()); 

     // You may want to change these 
     mRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
     mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 
     mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 

     // You'll definitely want to change this 
     mRecorder.setOutputFile("/mnt/sdcard/out"); 

     try { 
      mRecorder.prepare(); 
     } catch (IllegalStateException e) { 
      Log.e("IllegalStateException", e.toString()); 
     } catch (IOException e) { 
      Log.e("IOException", e.toString()); 
     } 
     mRecorder.start(); 

    } 
} 

Można też zadzwonić:

  • setVideoSize(int, int);
  • setVideoFrameRate(int);
+1

Dzięki! To naprawdę działa! Może wiesz, jak zastosować te ustawienia w CamcorderProfile? Ponieważ używam generowanych automatycznie parametrów jako 'camcorderProfile = CamcorderProfile.get (CamcorderProfile.QUALITY_HIGH);', wtedy wszystkie ustawienia są stosowane jako 'mediaRecorder.setProfile (camcorderProfile); ' – Sergii

+0

możesz podać więcej informacji, ponieważ nie działa poprawnie. –

9

Można przygotować MediaRecorder przez skopiowanie wymaganych pól z wbudowanego profilu (CamcorderProfile). Po prostu pomiń ustawienia audio i powinieneś być gotowy. Zmodyfikuj poniższy kod zgodnie ze swoimi potrzebami, krok 3 jest tutaj niezbędny.

private boolean prepareVideoRecorder() { 

    mCamera = getCameraInstance(); 
    mMediaRecorder = new MediaRecorder(); 

    // store the quality profile required 
    CamcorderProfile profile = CamcorderProfile.get(cameraid, CamcorderProfile.QUALITY_HIGH); 

    // Step 1: Unlock and set camera to MediaRecorder 
    mCamera.unlock(); 
    mMediaRecorder.setCamera(mCamera); 

    // Step 2: Set sources 
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

    // Step 3: Set all values contained in profile except audio settings 
    mMediaRecorder.setOutputFormat(profile.fileFormat); 
    mMediaRecorder.setVideoEncoder(profile.videoCodec); 
    mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate); 
    mMediaRecorder.setVideoFrameRate(profile.videoFrameRate); 
    mMediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight); 

    // Step 4: Set output file 
    mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()); 

    // Step 5: Set the preview output 
    mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface()); 

    // Step 6: Prepare configured MediaRecorder 
    try { 
     mMediaRecorder.prepare(); 
    } catch (IllegalStateException e) { 
     releaseMediaRecorder(); 
     return false; 
    } catch (IOException e) { 
     releaseMediaRecorder(); 
     return false; 
    } 
    return true; 
} 
+0

działa dobrze .. dziękuję –

+0

ładne rozwiązanie ...... bardzo przydatne dla mnie ..... – jack