MediaRecorder останавливает поток пользовательского интерфейса - PullRequest
1 голос
/ 23 сентября 2019

Я использую библиотеку CameraKit для записи видео в моем приложении.Проблема, с которой я сталкиваюсь, заключается в том, что когда я начинаю запись, мне нужно также показать прогресс записи.Но когда я вызываю метод видеозаписи, в котором MediaRecorder готовится и запускается, который останавливает поток пользовательского интерфейса на ~ 500-700 мс, что не позволяет анимировать progressBar и такое ощущение, что при длительном нажатии кнопки записи требуется много времени, но в действительности это MediaRecorder.это требует времени.Можно ли запустить MediaRecorder в фоновом потоке, не останавливая анимацию?

Ниже приведен метод, я также попробовал Handler, но это не имеет особого значения:

void captureVideo(final File videoFile,final int maxDuration,final VideoCapturedCallback callback) {
        Log.d("usm_recording_captureVideo","init");
        synchronized (mCameraLock)
        {
               /*new Handler().post(new Runnable() {
                    @Override
                    public void run() {*/
                        try {
                            Log.d("usm_recording_captureVideo", "try");

                            if (prepareMediaRecorder(videoFile, maxDuration)) {
                                Log.d("usm_recording_captureVideo", "prepareMediaRecorder");

                                mMediaRecorder.start();
                                mRecording = true;
                                Log.d("usm_recording_captureVideo", "started recorder");


                                Camera1.this.mVideoCallback = callback;

                            } else {
                                releaseMediaRecorder();
                            }
                        }
                        catch (Exception e) {
                            Log.d("asad_capture_video", "e : " + e.getMessage());
                            releaseMediaRecorder();
                        }
                    /*}
                });*/
            Log.d("usm_recording_captureVideo","captureVideo");
        }

    }

Редактировать:

Я использовал HandlerThread для запуска устройства записи мультимедиа, которое не позволяет пользовательскому интерфейсу зависать сейчас, но поскольку прогресс начинается еще до ожидания запуска MediaRecorder.Таким образом, фактическое сохраненное видео имеет длину приблизительно на 500-700 мс меньше, чем ожидаемая запись.

HandlerThread thread;
    @Override
    void captureVideo(final File videoFile,final int maxDuration,final VideoCapturedCallback callback) {
        Log.d("usm_recording_captureVideo","init");
        synchronized (mCameraLock)
        {
                                thread = new HandlerThread("MediaRecorderHandlerThread");
                                thread.start();

                                Handler handler = new Handler(thread.getLooper());
                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        try {
                                           // Log.d("usm_recording_captureVideo", "try");

                                            if (prepareMediaRecorder(videoFile, maxDuration)) {
                                           // Log.d("usm_recording_captureVideo", "prepareMediaRecorder");

                                            mMediaRecorder.start();
                                        } else {
                                            releaseMediaRecorder();
                                        }
                                            mRecording = true;
                                          //  Log.d("usm_recording_captureVideo", "started recorder");


                                            Camera1.this.mVideoCallback = callback;

                                        }
                                        catch (Exception e) {
                                          //  Log.d("asad_capture_video", "e : " + e.getMessage());
                                            releaseMediaRecorder();
                                        }

                                    }
                                });
            Log.d("usm_recording_captureVideo","captureVideo");
        }

    }
...