developer tip

애플리케이션 백그라운드에서 동영상을 녹화하는 방법 : Android

copycodes 2020. 12. 9. 08:23
반응형

애플리케이션 백그라운드에서 동영상을 녹화하는 방법 : Android


을 (를) 사용하여 응용 프로그램의 배경에서 비디오를 녹화 할 수있는 응용 프로그램을 개발 중입니다 Service.

문제 설명 :

내 응용 프로그램에서 녹음이 예약됩니다. 사용자가 오후 1 시부 터 오후 3 시까 지 비디오를 녹화하려면 작업을 예약하고 애플리케이션을 종료 할 수 있습니다. 애플리케이션은 오후 1 시부 터 오후 3 시까 지 자동으로 녹화를 시작합니다.

내가 아직 한 일 :

내 쿼리에 대해 검색했지만 솔루션을 얻지 못했습니다. 많은 기사에서 불가능하다고 말합니다. 그러나 Google Play 에는 애플리케이션의 백그라운드에서 비디오를 녹화 할 수 있는 일부 애플리케이션 (예 : MyCar Recorder )이 있습니다.

나는 가지고 기사 같은 있지만 작동하지 않는 약을.

이 기능을 구현하는 방법은 무엇입니까?


1- 다음과 같은 서비스를 시작하는 활동을 만들었습니다.

package com.android.camerarecorder;

import android.app.Activity;
import android.content.Intent;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

public class CameraRecorder extends Activity implements SurfaceHolder.Callback {
    private static final String TAG = "Recorder";
    public static SurfaceView mSurfaceView;
    public static SurfaceHolder mSurfaceHolder;
    public static Camera mCamera ;
    public static boolean mPreviewRunning;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        Button btnStart = (Button) findViewById(R.id.StartService);
        btnStart.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                Intent intent = new Intent(CameraRecorder.this, RecorderService.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startService(intent);
                finish();
            }
        });

        Button btnStop = (Button) findViewById(R.id.StopService);
        btnStop.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                stopService(new Intent(CameraRecorder.this, RecorderService.class));
            }
        });
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

    }

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

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub

    }
}

2-이제 다음과 같이 백그라운드에서 비디오를 녹화하는 서비스를 만들었습니다 .

    package com.android.camerarecorder;
    import java.io.IOException;
    import java.util.List;
    import android.app.Service;
    import android.content.Intent;
    import android.graphics.PixelFormat;
    import android.hardware.Camera;
    import android.hardware.Camera.Size;
    import android.media.MediaRecorder;
    import android.os.IBinder;
    import android.util.Log;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.widget.Toast;

    public class RecorderService extends Service {
        private static final String TAG = "RecorderService";
        private SurfaceView mSurfaceView;
        private SurfaceHolder mSurfaceHolder;
        private static Camera mServiceCamera;
        private boolean mRecordingStatus;
        private MediaRecorder mMediaRecorder;

        @Override
        public void onCreate() {
            mRecordingStatus = false;
            //mServiceCamera = CameraRecorder.mCamera;
            mServiceCamera = Camera.open(1);
            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);
                mMediaRecorder.setOutputFile("/sdcard/video.mp4");
                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;
        }
    }

SD 카드에 video.mp4 파일이 생성됩니다. 더 많은 기능을 추가하기 위해 코드를 변경할 수 있지만 기본 기능은이 코드를 통해 달성됩니다 (예 : 백그라운드에서 비디오 녹화).

참고 : 버튼 클릭 활동을 통해 서비스를 시작했지만 broadcastreceiver 등과 같은 다른 방법으로도 시작할 수 있습니다.

도움이 되었기를 바랍니다 !! 건배.


예, 다음과 같이 배경 비디오를 녹화 할 수 있습니다.

먼저 서비스를 이용하여 동영상 앱을 만듭니다. 표시되지 않도록보기를 설정하지 마십시오. 당신이 서비스에서 그것을하고 있다면 그것은 더 낫습니다. 왜냐하면 ...

Second, you can use the AlarmManager for setting the alarm of particular time and then at that time, by using intent, start your service again. For stopping your app you can use AlarmManager, as well.

참고URL : https://stackoverflow.com/questions/10121660/how-to-record-video-from-background-of-application-android

반응형