4

I found questions like this. Some say that is possible, but the solutions have not worked for me and others say that is not possible.

I have this code for record mp4:

    import java.io.IOException;

    import android.app.Activity;
    import android.content.pm.ActivityInfo;
    import android.media.CamcorderProfile;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    import android.os.Environment;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.View.OnClickListener;


    public class MainActivity extends Activity implements OnClickListener, SurfaceHolder.Callback {
        MediaRecorder recorder;
        SurfaceHolder holder;
        boolean recording = false;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);


            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

            recorder = new MediaRecorder();
            initRecorder();
            setContentView(R.layout.activity_main);

            SurfaceView cameraView = (SurfaceView) findViewById(R.id.surfaceView1);
            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(Environment.getExternalStorageDirectory().getPath() + "/video.mp4");
            recorder.setMaxDuration(5 * 1000); // 50 seconds
            recorder.setMaxFileSize(5 * 1000000); // 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();
        }
    }

And this other for get frames in real time:

        import java.io.IOException;
    import java.util.Iterator;
    import java.util.List;

    import android.app.Activity;
    import android.content.pm.ActivityInfo;
    import android.graphics.ImageFormat;
    import android.hardware.Camera;
    import android.hardware.Camera.ErrorCallback;
    import android.hardware.Camera.Size;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.SurfaceHolder.Callback;

    public class MainActivity extends Activity {
        SurfaceView mVideoCaptureView;
        Camera mCamera;




        @Override
        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            mVideoCaptureView = (SurfaceView) findViewById(R.id.surfaceView1);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            SurfaceHolder videoCaptureViewHolder = mVideoCaptureView.getHolder();
            videoCaptureViewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            videoCaptureViewHolder.addCallback(new Callback() {
                public void surfaceDestroyed(SurfaceHolder holder) {
                    stopVideo();
                }
                public void surfaceCreated(SurfaceHolder holder) {
                    startVideo();
                }

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





        private void startVideo() {

            //Open camera
            SurfaceHolder videoCaptureViewHolder = null;
            try {
                mCamera = Camera.open();
            } catch (RuntimeException e) {
                Log.e("CameraTest", "Camera Open failed");
                return;
            }
            mCamera.setErrorCallback(new ErrorCallback() {
                public void onError(int error, Camera camera) {
                }
            }); 

            //Get params
            Camera.Parameters parameters = mCamera.getParameters();


            //Get Frame rate
            int[] minFrameRate = {90000,90000};
            List<int[]> supportedPreviewFps=parameters.getSupportedPreviewFpsRange();
            Iterator<int[]> supportedPreviewFpsIterator=supportedPreviewFps.iterator();
            while(supportedPreviewFpsIterator.hasNext()){
                int[] tmpRate=supportedPreviewFpsIterator.next();   

                if(tmpRate[0]<minFrameRate[0])
                {
                    minFrameRate[0] = tmpRate[0];
                    minFrameRate[1] = tmpRate[1];
                }


            }

            //Set frame rate
            parameters.setPreviewFpsRange(minFrameRate[0],minFrameRate[1]);
            Log.i("Info", "Frame rate set to: " + minFrameRate[0] + ','+ minFrameRate[1]);

            //Get image size
            List<Size> supportedPreviewSizes=parameters.getSupportedPreviewSizes();
            Iterator<Size> supportedPreviewSizesIterator=supportedPreviewSizes.iterator();
            while(supportedPreviewSizesIterator.hasNext()){
                Size tmpSize=supportedPreviewSizesIterator.next();
                Log.v("CameraTest","supportedPreviewSize.width = "+tmpSize.width+"supportedPreviewSize.height = "+tmpSize.height);
            }

            //Set params
            mCamera.setParameters(parameters);
            if ( mVideoCaptureView!=null)
                videoCaptureViewHolder = mVideoCaptureView.getHolder();
            try 
            {
                mCamera.setPreviewDisplay(videoCaptureViewHolder);
            } catch (Throwable t) 
            {
                Log.e("Error","mCamera.setPreviewDisplay(videoCaptureViewHolder) fail");
            }


            //Start camera
            Size previewSize=mCamera.getParameters().getPreviewSize();
            int dataBufferSize=(int)(previewSize.height*previewSize.width*
                                   (ImageFormat.getBitsPerPixel(mCamera.getParameters().getPreviewFormat())/8.0));
            mCamera.addCallbackBuffer(new byte[dataBufferSize]);
            mCamera.addCallbackBuffer(new byte[dataBufferSize]);
            mCamera.addCallbackBuffer(new byte[dataBufferSize]);




            mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {           

                public synchronized void onPreviewFrame(byte[] data, Camera camera) {


                    try
                    {                   
                        camera.addCallbackBuffer(data);

                    }catch (Exception e) {

                        Log.e("CameraTest", "addCallbackBuffer error");

                    }


                }
            });







            try {
                mCamera.startPreview();
            } catch (Throwable e) {
                mCamera.release();
                mCamera = null;
                return;
            }
        }






        private void stopVideo() {

            Log.i("StopVideo","OK");


            if(null==mCamera)
                return;
            try {
                mCamera.stopPreview();
                mCamera.setPreviewDisplay(null);
                mCamera.setPreviewCallbackWithBuffer(null);
                mCamera.release();
            } catch (IOException e) {
                e.printStackTrace();
                return;
            }
            mCamera = null;
        }
        public void finish(){
            stopVideo();
            super.finish();
        }





        @Override
        public void onBackPressed() {

            stopVideo();
            super.onBackPressed();
        };







    }

This last code have a funcion "onPreviewFrame" that get frames in real time.

How I can include this function to the first piece of code?

I've tried to make using the Camera object, but if Camara is open and starts recording mp4 fails because it can not do both at once

user3745618
  • 239
  • 1
  • 3
  • 11
  • Do you have requirements on minimum android SDK version you need to support? – Zharf Jun 18 '14 at 11:52
  • You're answering yourself: *"if Camara is open and starts recording mp4 fails because it can not do both at once"*. Also detail *"Some say is possible"*. Who? Where? – m0skit0 Jun 18 '14 at 11:52
  • Have you tried JavaCV as I recommended in your previous question? http://stackoverflow.com/a/24280418/1770916 If you get frames doing this still you need to encode them after editing using some encoder. So your final destination will be JavaCV. – Ahmed Nawaz Jun 18 '14 at 11:59
  • No, I do not I have minimum requirements sdk. I no longer want edit the frames, just get them. I have relied on these questions.http://stackoverflow.com/questions/16404599/setoneshotpreviewcallback-not-hitting-onpreviewframe-in-callback/16574244#16574244. http://stackoverflow.com/questions/6386903/android-preview-processing-while-video-recording – user3745618 Jun 18 '14 at 12:18
  • and it worked for you? for me reconnect and set callback after MediaRecorder.start didn't work: https://stackoverflow.com/questions/52314822/video-recording-and-onpreviewframe-callback-at-the-same-time – user924 Sep 14 '18 at 07:05

0 Answers0