Git Product home page Git Product logo

videorecorder's Introduction

VideoRecorder

警告

此项目是作为个人学习用,包含许多未解决的bug

Feature

  • 高性能任意尺寸视频录制 (以相机支持的最大尺寸预览)

  • 断点录制 (断点回删)

  • 离屏录制

  • 录制时的Canvas API支持

  • 实时滤镜

  • 后期滤镜

  • 人脸贴纸

  • 抖音特效

API

    private void initRecorder() {
        ICameraPreview cameraPreview = new DefaultCameraPreview(mTextureView);
//        ICameraPreview cameraPreview = new OffscreenCameraPreview(getContext(), 1920, 1920); //离屏录制

        Camera.CameraBuilder cameraBuilder = new Camera.CameraBuilder(getActivity())
                .useDefaultConfig()
                .setFacing(android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT)
                .setPreviewSize(new Size(2048, 1536))
                .setRecordingHint(true)
                .setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);

        //视频效果管理器
        mEffectsManager = new EffectsManager();
        mEffectsManager.addEffect(new CanvasOverlayEffect() {
            private FPSCounterFactory.FPSCounter1 mCounter;
            Paint mPaint;

            @Override
            public void prepare(Size size) {
                super.prepare(size);
                mPaint = new Paint();
                mPaint.setColor(Color.YELLOW);
                mPaint.setAlpha(230);
                mPaint.setTextSize(40);
                mPaint.setStyle(Paint.Style.FILL);
                mPaint.setAntiAlias(true);

                mCounter = new FPSCounterFactory.FPSCounter1();
            }

            @Override
            protected void drawCanvas(Canvas canvas) {
                canvas.drawText(String.format(Locale.getDefault(), "%.2f", mCounter.getFPS()), canvas.getWidth() / 2, canvas.getHeight() / 2, mPaint);
            }
        });

        VideoRecorder.Builder builder = new VideoRecorder.Builder(cameraPreview)
                .setCallbackHandler(new CallbackHandler())
                .setLogFPSEnable(false)
                .setCameraBuilder(cameraBuilder)
                .setDrawTextureListener(mEffectsManager)
                .setOutPutPath(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), File.separator + "VideoRecorder").getAbsolutePath())
                .setFrameRate(30)
                .setChannelCount(1);

        //分段录制,回删支持
        MultiPartRecorder.Builder multiBuilder = new MultiPartRecorder.Builder(builder);
        mRecorder = multiBuilder
                .addPartListener(new MultiPartRecorder.VideoPartListener() {
                    @Override
                    public void onRecordVideoPartStarted(MultiPartRecorder.Part part) {
                        LogUtil.logd("onRecordVideoPartStarted \t" + part.toString());
                    }

                    @Override
                    public void onRecordVideoPartSuccess(MultiPartRecorder.Part part) {
                        LogUtil.logd("onRecordVideoPartSuccess \t" + part.toString());
                    }

                    @Override
                    public void onRecordVideoPartFailure(MultiPartRecorder.Part part) {
                        LogUtil.loge("onRecordVideoPartFailure \t" + part.file);
                        mRecorderIndicator.removePart(part.file.getAbsolutePath());
                        mRecorder.removePart(part.file.getAbsolutePath());
                    }
                })
                .setMergeListener(new MultiPartRecorder.VideoMergeListener() {
                    @Override
                    public void onStart() {
                        LogUtil.logd("merge onStart");
                    }

                    @Override
                    public void onSuccess(File outFile) {
                        LogUtil.logd("merge Success \t" + outFile);
                        Intent intent = new Intent(Intent.ACTION_VIEW);
                        if (Build.VERSION.SDK_INT >= 24) {
                            intent.setDataAndType(FileProvider.getUriForFile(getContext().getApplicationContext(), BuildConfig.APPLICATION_ID + ".provider", outFile), "video/*");
                            intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        } else {
                            intent.setDataAndType(Uri.fromFile(outFile), "video/*");
                        }
                        startActivity(intent);
                    }

                    @Override
                    public void onError(Exception e) {
                        LogUtil.logd("merge Error \t" + e.toString());
                    }

                    /**
                     * 合并进度
                     *
                     * @param value 0 - 1
                     */
                    @Override
                    public void onProgress(float value) {
                        LogUtil.logd("merge onProgress \t" + value);
                    }

                })
                .setFileFilter(new MultiPartRecorder.FileFilter() {
                    @Override
                    public boolean filter(MultiPartRecorder.Part part) {
                        return part.duration > 1500;
                    }
                })
                .build();

        mCameraController = mRecorder.getCameraController();
    }

ScreenShort

Download apk

VideoRecorder

学习过程中记录下来的一些有价值的资料

相关资料.md

videorecorder's People

Contributors

chenjim avatar erleizh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

videorecorder's Issues

Quality of recording

When i compared the recording with your library with other recording the quality is a bite off.
Doesn't seem to be as sharp.

Is there away to set this in the encoder?

also how do I set the to always record in 30fps? most videos are not at 30pfs

mCameraController.setPreviewFpsRange(); java.lang.IllegalStateException: camera == null

            Camera.CameraBuilder cameraBuilder = new Camera.CameraBuilder(this)
                    .useDefaultConfig()
                    .setFacing(android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT)
                    .setPreviewSize(new Size(1920, 1080))
                    .setRecordingHint(true)

    ....
                    
    mCameraController = mRecorder.getCameraController();

    mRecorder.startPreview();

I tried to set mCameraController.setPreviewFpsRange(new FpsRange(20000, 20000)); before mRecorder.startPreview(); and after it

but it fails in both cases

   java.lang.IllegalStateException: camera == null
                      at com.erlei.videorecorder.recorder.DefaultCameraController.checkCameraState(DefaultCameraController.java:475)
                      at com.erlei.videorecorder.recorder.DefaultCameraController.setPreviewFpsRange(DefaultCameraController.java:69)
                      

it would be great if I could set fps range during creating CameraBuilder

Capture picture is blank and only 7k

When I do a single tap to capture the picture it only saves 7k and it is blank.
I'm using Samsung S10 Android OS13.

It did capture successfully once.

Video path set

I set .setOutPutPath(Environment.getExternalStorageDirectory().getAbsolutePath()) in

 VideoRecorder.Builder builder = new VideoRecorder.Builder(cameraPreview)
                .setCallbackHandler(new VideoRecorderHandler())
                .setLogFPSEnable(false)
                .setCameraBuilder(cameraBuilder)
                .setDrawTextureListener(mEffectsManager)
                .setOutPutPath(Environment.getExternalStorageDirectory().getAbsolutePath())

But it still saves file in different folder

/storage/emulated/0/Android/data/com.example.android.mediarecorder/cache/MultiPartRecorder/2018-09-14-11-07-55-771.mp4

isn't it should /storage/emulated/0/ folder if I set Environment.getExternalStorageDirectory().getAbsolutePath()?

TextureView size can be less than Camera Preview size

For example my phone display size is 1280x720, but camera supports 1920x1080 resolution and I would like to use

So onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) would return 1280 width and 720 height

set this view to new DefaultCameraPreview(mTextureView);

and when I set FullHD resolution for Camera cameraParameters.setPreviewSize(1920, 1080); it doesn't show full frame on phone screen (and mb also on recorded video), it looks like it's zoomed (not all 1920x1080 frame is visible to me, only cropped 1280x720 center)

not supporting other device

I am using this library but recorded video not playing is some devices or taking too long to play. Please provide some solution.

Draw text on frames before recording

I was working a little bit with OpenGLES frame processing:

google/grafika#74 (comment)

I encoded a video with text, though text had a black background

Do you have plans to add Draw Text support in this project?

Mb we should use android-openGL-canvas lib https://github.com/ChillingVan/android-openGL-canvas to draw on GL Texture (if it'll make things easier)

Also there is AndroidInstantVideo https://github.com/ChillingVan/AndroidInstantVideo
It draws text on preview, but unfortunately it doesn't draw text on a recorded video
And I created two issues there:
ChillingVan/AndroidInstantVideo#14
ChillingVan/AndroidInstantVideo#15

Pause Resume request

Would be great to pause video recording temporary and then resume recording later (e.g, after 5-10 seconds)

For example we won't feed anything (audio or video) to encoder about 5-10 seconds

But there could be a problem with timestamps (e.g. we were recording 10 seconds but it during playback in video player it says 15 seconds)

I suggest subtract this not recording count milliseconds (the time we wasn't feed any data)

    protected long getPTSUs() {
		long result = System.nanoTime() / 1000L;
		// presentationTimeUs should be monotonic
		// otherwise muxer fail to write
		if (result < prevOutputPTSUs)
			result = (prevOutputPTSUs - result) + result;
		return result - notRecordingTimeUS;
    }

	public void setNotRecordingTimeUS(long notRecordingTimeUS) {
		this.notRecordingTimeUS = notRecordingTimeUS; // e.g. subtract 5 seconds (the time we wasn't feed any video/audio to encoders)
	}

	private long notRecordingTimeUS;

Camera.open method is called twice. It causes issue on KitKat 4.4

I tried next sample on 6.0.1 Marshmallow Device and it worked fine

But when I tried on 4.4 KitKat device then preview doesn't even work, at app start it updates only two frames and then it becomes frozen (always the same frame on preview)

private void testVideoRecording2() {

        ICameraPreview cameraPreview = new DefaultCameraPreview(mPreview);

        com.erlei.videorecorder.camera.Camera.CameraBuilder cameraBuilder =
                new com.erlei.videorecorder.camera.Camera.CameraBuilder(this)
                        .useDefaultConfig()
                        .setFacing(Camera.CameraInfo.CAMERA_FACING_BACK)
                        .setPreviewSize(new Size(1280, 720))
                        .setRecordingHint(true)
                        .setPreviewFpsRange(new FpsRange(30000, 30000))
                        .setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)
                        .setPreviewFrameCallback(new com.erlei.videorecorder.camera.Camera.PreviewCallback() {
                            @Override
                            public void onPreviewFrame(byte[] frame) {
                                Log.i(TAG, "onPreviewFrame " + frame.length);
                            }
                        });


        //视频效果管理器
        mEffectsManager = new EffectsManager();
        mEffectsManager.addEffect(new CanvasOverlayEffect() {
            private FPSCounterFactory.FPSCounter1 mCounter;
            Paint mPaint;

            @Override
            public void prepare(Size size) {
                super.prepare(size);
                mPaint = new Paint();
                mPaint.setColor(Color.YELLOW);
                mPaint.setAlpha(230);
                mPaint.setTextSize(40);
                mPaint.setStyle(Paint.Style.FILL);
                mPaint.setAntiAlias(true);

                mCounter = new FPSCounterFactory.FPSCounter1();
            }

            @Override
            protected void drawCanvas(Canvas canvas) {
                canvas.drawText("test", canvas.getWidth() / 2, canvas.getHeight() / 2, mPaint);
            }
        });

        VideoRecorder.Builder builder = new VideoRecorder.Builder(cameraPreview)
                .setCallbackHandler(new VideoRecorderHandler())
                .setLogFPSEnable(false)
                .setCameraBuilder(cameraBuilder)
                .setDrawTextureListener(mEffectsManager)
                .setOutPutPath(Environment.getExternalStorageDirectory().getAbsolutePath())
                .setFrameRate(30)
                .setChannelCount(1);

        //分段录制,回删支持
        MultiPartRecorder.Builder multiBuilder = new MultiPartRecorder.Builder(builder);
        mRecorder = multiBuilder
                .addPartListener(new MultiPartRecorder.VideoPartListener() {
                    @Override
                    public void onRecordVideoPartStarted(MultiPartRecorder.Part part) {
                        LogUtil.logd("onRecordVideoPartStarted \t" + part.toString());
                    }

                    @Override
                    public void onRecordVideoPartSuccess(MultiPartRecorder.Part part) {
                        LogUtil.logd("onRecordVideoPartSuccess \t" + part.toString());
                    }

                    @Override
                    public void onRecordVideoPartFailure(MultiPartRecorder.Part part) {
                        LogUtil.loge("onRecordVideoPartFailure \t" + part.file);
                        //mRecorderIndicator.removePart(part.file.getAbsolutePath());
                        mRecorder.removePart(part.file.getAbsolutePath());
                    }
                })
                .setMergeListener(new MultiPartRecorder.VideoMergeListener() {
                    @Override
                    public void onStart() {
                        LogUtil.logd("merge onStart");
                    }

                    @Override
                    public void onSuccess(File outFile) {
                        LogUtil.logd("merge Success \t" + outFile);
                
                    }

                    @Override
                    public void onError(Exception e) {
                        LogUtil.logd("merge Error \t" + e.toString());
                    }

                    /**
                     * 合并进度
                     *
                     * @param value 0 - 1
                     */
                    @Override
                    public void onProgress(float value) {
                        LogUtil.logd("merge onProgress \t" + value);
                    }

                })
                .setFileFilter(new MultiPartRecorder.FileFilter() {
                    @Override
                    public boolean filter(MultiPartRecorder.Part part) {
                        return part.duration > 1500;
                    }
                })
                .build();

        mCameraController = mRecorder.getCameraController();

        mRecorder.startPreview();

        mRecorder.startRecord();

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                mRecorder.stopRecord();
                Log.i(TAG, "RecordFinished");
            }
        }, 7000);
    }

使用Textureview 预览 , onSurfaceTextureDestroyed 没有调用

使用 Textureview 预览时 , 退出app到后台 , 然后打开其他相机app , 之后再返回app , 预览界面卡住 ,点击预览会崩溃

这是由于app切换到后台 onSurfaceTextureDestroyed 没有调用 , 导致预览没有关闭 , ,而且重新进入时 onSurfaceTextureAvailable 也没有调用 , 中间有其他app使用了camera就会导致

focus always "fixed"

Another question. This might fix the issue I'm having with the preview quality.
When I goto the Setting screen the focus option is only "fixed".

this is the builder

    val cameraBuilder = CameraBuilder(activity)
        .useDefaultConfig()
        .setFacing(Camera.CameraInfo.CAMERA_FACING_BACK)
        .setPreviewSize(Size(1140, 2560))
        .setRecordingHint(true)
        .setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO, Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO, Camera.Parameters.FOCUS_MODE_MACRO)

I even tried in code

            mCameraController?.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO)

and still does not work.

I'm using Samsung S10 android os13 and I know it has auto focus.
supported=[fixed]

on Samsung S23+ it does report
supported=[infinity, auto, macro, continuous-video, continuous-picture]

项目导入后报了一个错误,请指教

Error:CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
Configuration failed.
CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
Configuration failed.
CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
Configuration failed.
CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
Configuration failed.
FAILURE: Build failed with an exception.

  • What went wrong:
    A problem occurred configuring project ':VideoRecorderCore'.

executing external native build for cmake D:\Android\AndroidStudioProjects\VideoRecorder-master\VideoRecorderCore\CMakeLists.txt

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

  • Get more help at https://help.gradle.org

BUILD FAILED in 1s

Cause: executing external native build for cmake /home/sumit/Android_Projects/Android(GS)/VideoRecorder/VideoRecorderCore/CMakeLists.txt

Why this kind issue occuring.when i've setup completed
rg.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':VideoRecorderCore'.
at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:94)
at org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:89)
at org.gradle.configuration.project.LifecycleProjectEvaluator.doConfigure(LifecycleProjectEvaluator.java:70)
at org.gradle.configuration.project.LifecycleProjectEvaluator.access$100(LifecycleProjectEvaluator.java:34)
at org.gradle.configuration.project.LifecycleProjectEvaluator$ConfigureProject.run(LifecycleProjectEvaluator.java:110)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:50)
at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:666)
at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:135)
at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35)
at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:62)
at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:38)
at org.gradle.initialization.DefaultGradleLauncher$ConfigureBuild.run(DefaultGradleLauncher.java:249)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
at org.gradle.initialization.DefaultGradleLauncher.configureBuild(DefaultGradleLauncher.java:167)
at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:126)
at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:109)
at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:78)
at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:75)
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:152)
at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:100)
at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:75)
at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:53)
at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$1.run(RunAsBuildOperationBuildActionRunner.java:43)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:40)
at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:47)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:80)
at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:53)
at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:57)
at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:32)
at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:69)
at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:30)
at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59)
at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44)
at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:45)
at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
at org.gradle.util.Swapper.swap(Swapper.java:38)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:82)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.lang.Thread.run(Thread.java:745)

: AudioThread#run java.lang.IllegalStateException on KitKat 4.4 (GT-9070)

Recording fails to start on KitKat 4.4 (Samsuns GT-9070), some audio error

09-20 22:02:17.636 16238-16238/com.testaudiovideosample E/dalvikvm: Could not find class 'android.support.v4.app.ActivityCompat$SharedElementCallback21Impl', referenced from method android.support.v4.app.ActivityCompat.setExitSharedElementCallback
09-20 22:02:29.788 16238-16238/com.testaudiovideosample E/VideoRecorder-VideoRecorder: startEncoder:begin
09-20 22:02:29.798 16238-16331/com.testaudiovideosample E/VideoRecorder-VideoRecorder: startEncoder:begin
09-20 22:02:29.938 16238-16331/com.testaudiovideosample E/VideoRecorder-VideoRecorder: supportedType:OMX.ST.VFM.MPEG4Enc,MIME=video/3gpp
    supportedType:OMX.ST.VFM.MPEG4Enc,MIME=video/mp4v-es
    supportedType:OMX.ST.VFM.H264Enc,MIME=video/avc
    supportedType:OMX.google.amrnb.encoder,MIME=audio/3gpp
    supportedType:OMX.google.amrwb.encoder,MIME=audio/amr-wb
    supportedType:OMX.google.aac.encoder,MIME=audio/mp4a-latm
    selected codec: OMX.google.aac.encoder
    format: {bitrate=64000, channel-count=1, aac-profile=2, mime=audio/mp4a-latm, sample-rate=44100, channel-mask=16}
09-20 22:02:30.729 16238-16339/com.testaudiovideosample E/BellagioCore: ST Static Component Loader : Cannot open OpenMAX registry file /tmp/.omxregister
09-20 22:02:30.739 16238-16339/com.testaudiovideosample E/BellagioCore: Component loader 1 constructor fails. Error= 0x80001000 
09-20 22:02:30.769 16238-16331/com.testaudiovideosample E/VideoRecorder-VideoRecorder: prepare finishing
09-20 22:02:31.640 16238-16337/com.testaudiovideosample E/ACodec: OMX/mediaserver died, signalling error!
09-20 22:02:31.640 16238-16336/com.testaudiovideosample E/MediaCodec: Codec reported an error. (omx error 0x8000100d, internalError -32)
09-20 22:02:31.640 16238-16339/com.testaudiovideosample E/ACodec: OMX/mediaserver died, signalling error!
09-20 22:02:31.640 16238-16339/com.testaudiovideosample E/MediaCodec: Codec reported an error. (omx error 0x8000100d, internalError -32)
09-20 22:02:31.640 16238-16259/com.testaudiovideosample E/Surface: queueBuffer: error queuing buffer to SurfaceTexture, -32
09-20 22:02:31.640 16238-16259/com.testaudiovideosample E/[EGL-ERROR]: void __egl_platform_queue_buffer(mali_base_ctx_handle, egl_buffer*):1122: unable to queue buffer (0x52ac32ac)
09-20 22:02:31.650 16238-16258/com.testaudiovideosample E/Camera: Error 100
09-20 22:02:37.495 16238-16343/com.testaudiovideosample E/VideoRecorder: AudioThread#run
    java.lang.IllegalStateException
        at android.media.MediaCodec.getBuffers(Native Method)
        at android.media.MediaCodec.getInputBuffers(MediaCodec.java:542)
        at com.erlei.videorecorder.encoder.MediaEncoder.encode(MediaEncoder.java:249)
        at com.erlei.videorecorder.encoder.MediaAudioEncoder$AudioThread.run(MediaAudioEncoder.java:154)

录制时计算的fps 显示错误(翻倍)

由于视频录制的时候需要绘制两次的原因(一次绘制到预览的 Surface , 一次绘制到编码的 Surface ), 导致录制的时候在 drawCanvas 方法里计算的 fps 会翻倍

Is it possible to record in background (Service)?

We can do it with FFmpeg and just encode bytes from onPreviewFrame
With FFmpeg it's easy because we don't work with SurfaceView and other stuff which works only for Activity
So we can easily set onPreviewFrame for Camera in service (of course initially we create Camera in Activity but when we go background we start Service and pass object of Camera to that Service and just continue using onPreviewFrame callback for recording bytes in Service)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.