MediaRecorder - 使用GLSurfaceView的SurfaceTexture中的新Surface作为预览时,帧速率减速为爬行

时间:2018-01-26 08:48:47

标签: android android-mediarecorder glsurfaceview

我目前正在尝试使用GLSurfaceView作为MediaRecorder to record a video的预览。我GLSurfaceView的当前扩展程序设置为SurfaceTexture,作为Camera

MediaRecorder对象的预览

我决定为GLSurfaceView的扩展程序SurfaceTexture制作一个getter,并设置我MediaRecorder的预览表面,如下所示:

mMediaRecorder.setPreviewDisplay(new Surface(glSurfaceViewInstance.getSurfaceTexture()))

我目前的问题是,出于某种原因,预览的帧率开始正常,但是大幅减慢到爬行,可能以静止图像结束我按下录制按钮的时间越长。

为什么会这样,我该如何防止它发生?

1 个答案:

答案 0 :(得分:0)

我认为这次是一个线程问题。我的UI更新Thread的代码是这样的:

public class ThreadProgress extends Thread implements Runnable {
        @Override
        public void run() {
            while (progressValue < MAX_DURATION_VIDEO && !mThreadProgress.isInterrupted() && isRecording) {
                /*
                try {
                    progressValue = (int) (previousProgressInMillis + System.currentTimeMillis() - startProgressMillis);
                    Log.i("progress_val", progressValue + "");
                    Message message = new Message();
                    message.arg1 = progressValue;
                    handler.sendMessage(message);
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;
                }
                */

                progressValue = (int) (previousProgressInMillis + System.currentTimeMillis() - startProgressMillis);
                Log.i("progress_val", progressValue + "");
                Message message = new Message();
                message.arg1 = progressValue;
                handler.sendMessage(message);
            }
            if (progressValue == MAX_DURATION_VIDEO) {
                try {
                    mMediaRecorder.stop();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

使用评论的部分而不是我已经取消注释的部分。是因为Thread.sleep(1)应该疏通线程队列还是什么?