Example of Camera preview using SurfaceTexture in Android

前端 未结 2 1321
情书的邮戳
情书的邮戳 2020-12-02 13:28

I am trying to render camera preview using SurfaceTexture. I read the document but unable to understand how it works.

Can anyone provide one sample example(very basi

相关标签:
2条回答
  • 2020-12-02 14:07
    public class VideoCapture extends Activity implements OnClickListener, SurfaceHolder.Callback {
    MediaRecorder recorder;
    SurfaceHolder holder;
    boolean recording = false;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    
    recorder = new MediaRecorder();
    initRecorder();
    
    SurfaceView cameraView = new SurfaceView(this);
    holder = cameraView.getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    
    cameraView.setClickable(true);
    cameraView.setOnClickListener(this);
    }
    
    private void initRecorder() {
    recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    
    CamcorderProfile cpHigh = CamcorderProfile
            .get(CamcorderProfile.QUALITY_HIGH);
    recorder.setProfile(cpHigh);
    recorder.setOutputFile("/sdcard/videocapture_example.mp4");
    recorder.setMaxDuration(50000); // 50 seconds
    recorder.setMaxFileSize(5000000); // Approximately 5 megabytes
    }
    
    private void prepareRecorder() {
    recorder.setPreviewDisplay(holder.getSurface());
    
    try {
        recorder.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
        finish();
    } catch (IOException e) {
        e.printStackTrace();
        finish();
    }
    }
    
    public void onClick(View v) {
    if (recording) {
        recorder.stop();
        recording = false;
    
        // Let's initRecorder so we can record again
        initRecorder();
        prepareRecorder();
    } else {
        recording = true;
        recorder.start();
    }
    }
    
    public void surfaceCreated(SurfaceHolder holder) {
    prepareRecorder();
    }
    
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    }
    
    public void surfaceDestroyed(SurfaceHolder holder) {
    if (recording) {
        recorder.stop();
        recording = false;
    }
    recorder.release();
    finish();
    }
    }
    
    0 讨论(0)
  • If you want to use the Camera with TextureSurface you can implement SurfaceTextureListener interface. You'll have to implement 4 methods:

    1) onSurfaceTextureAvailable - Here you setup your camera

    2)onSurfaceTextureSizeChanged - In your case, the Android's camera will handle this method

    3)onSurfaceTextureDestroyed - Here you destroy all camera stuff.

    4) onSurfaceTextureUpdated- Update your texture here when you have something to change!

    Check the example below:

        public class MainActivity extends Activity implements SurfaceTextureListener{
    
        private Camera mCamera;
        private TextureView mTextureView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            mTextureView = new TextureView(this);
            mTextureView.setSurfaceTextureListener(this);
    
            setContentView(mTextureView);
        }
    
        @Override
        public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
            mCamera = Camera.open();
    
            Camera.Size previewSize = mCamera.getParameters().getPreviewSize();
            mTextureView.setLayoutParams(new FrameLayout.LayoutParams(
                    previewSize.width, previewSize.height, Gravity.CENTER));
    
            try {
                mCamera.setPreviewTexture(surface);
            } catch (IOException t) {
            }
    
            mCamera.startPreview();
    
        }
    
        @Override
        public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
            // Ignored, the Camera does all the work for us
        }
    
        @Override
        public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
            mCamera.stopPreview();
            mCamera.release();
            return true;
        }
    
        @Override
        public void onSurfaceTextureUpdated(SurfaceTexture surface) {
            // Update your view here!
        }
    }
    

    Two more things: Don't forget to add the camera permissions in your project's manifest and the SurfaceTexture is available from API 11.

    0 讨论(0)
提交回复
热议问题