Android中的屏幕录制程序,而不是屏幕截图

Android中的屏幕录制程序,而不是屏幕截图,android,android-layout,android-intent,android-activity,android-fragments,Android,Android Layout,Android Intent,Android Activity,Android Fragments,我想使应用程序像简易屏幕录音机。我必须从哪里开始,因为我搜索了很多,但没有找到任何开始的链接。有任何用于创建屏幕录制器的api,而不是屏幕快照。我不想使用javacv从屏幕快照创建视频。我只想让用户启动应用程序,点击开始录制按钮,然后用户在手机上所做的一切都记录下来 1安卓系统中是否有用于此的api 2如何在android中创建屏幕录制器应用程序 3如果安卓系统中没有任何api,请参考其他api,以便我可以在安卓系统中使用 我搜索了很多,但仍然无法创建录制应用程序。 我有一个android应用程

我想使应用程序像简易屏幕录音机。我必须从哪里开始,因为我搜索了很多,但没有找到任何开始的链接。有任何用于创建屏幕录制器的api,而不是屏幕快照。我不想使用javacv从屏幕快照创建视频。我只想让用户启动应用程序,点击开始录制按钮,然后用户在手机上所做的一切都记录下来

1安卓系统中是否有用于此的api

2如何在android中创建屏幕录制器应用程序

3如果安卓系统中没有任何api,请参考其他api,以便我可以在安卓系统中使用

我搜索了很多,但仍然无法创建录制应用程序。 我有一个android应用程序,我在其中添加代码,在特定时间后使用处理程序拍摄屏幕截图,最后使用javacv创建视频,但我不喜欢,因为为此,我必须在每个应用程序中编写代码,并拍摄当前活动的屏幕截图,最后创建视频


如何轻松录制开发人员创建此应用程序?他们使用了哪种api。我想创建此应用程序的克隆。

Android不提供任何公开帧缓冲区的API,您需要根设备,并可以使用一些源代码获取原始帧缓冲区,然后进行录制

请记住,要执行此操作,您需要根设备


使用android kitkat最简单的方法是使用ADB screenrecord命令。

android不提供任何公开帧缓冲区的API,您需要根设备,并可以使用一些源代码获取原始帧缓冲区,然后进行记录

请记住,要执行此操作,您需要根设备


使用android kitkat最简单的方法是使用ADB screenrecord命令。

几乎没有解决办法,这不需要您为设备设置根目录

如果你正在为你的应用程序创建一个演示,那么你可以使用一个模拟器或bluestack和一个桌面屏幕记录器来记录这个模拟器

如果您需要在实际手机上显示正在使用的应用程序,那么您可以使用另一个摄像头记录正在使用的应用程序

如果您必须捕获屏幕并将手机连接到计算机,您可以从桌面以更快的速度拍摄手机屏幕的屏幕截图,方法与Dalvik Debug Monitor Device>screen capture相同,然后将图像组合成电影


如果你必须创建一个应用程序,那么你就必须进行探索。

几乎没有解决办法,这不需要你为你的设备设置根目录

如果你正在为你的应用程序创建一个演示,那么你可以使用一个模拟器或bluestack和一个桌面屏幕记录器来记录这个模拟器

如果您需要在实际手机上显示正在使用的应用程序,那么您可以使用另一个摄像头记录正在使用的应用程序

如果您必须捕获屏幕并将手机连接到计算机,您可以从桌面以更快的速度拍摄手机屏幕的屏幕截图,方法与Dalvik Debug Monitor Device>screen capture相同,然后将图像组合成电影


如果您必须创建一个应用程序,那么您必须进行探索。

根据Android 5.0,您将能够通过MediaProjection API捕获屏幕内容,而不必在设备上设置根目录。尝试在SurfaceView上投影并从那里录制。

根据Android 5.0,您将能够通过MediaProjection API捕获屏幕内容,并且不必为设备设置根目录。请尝试在SurfaceView上进行投影并从那里进行录制。

很抱歉回答得太晚,但这里有一个工作代码。它将在棒棒糖及以上的食物上起作用

    private VirtualDisplay mVirtualDisplay;
    private MediaRecorder mMediaRecorder;
    private MediaProjection mMediaProjection;
    private MediaProjectionCallback callback;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MediaProjectionManager projectionManager = (MediaProjectionManager) 
        context.getSystemService(Context.MEDIA_PROJECTION_SERVICE);
        mMediaProjection.registerCallback(callback, null);
        initRecorder();
        mMediaRecorder.prepare();
        mVirtualDisplay = createVirtualDisplay();
        mMediaRecorder.start();
}

public void initRecorder() {
        path = "/sdcard/Record/video" + ".mp4";
        recId = "capture-" + System.currentTimeMillis() + ".mp4";
        File myDirectory = new File(Environment.getExternalStorageDirectory(), "Record");

            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            mMediaRecorder.setVideoEncodingBitRate(MainFragment.bitRate);          
            mMediaRecorder.setVideoFrameRate(30);
            mMediaRecorder.setVideoSize(MainFragment.DISPLAY_WIDTH,
            MainFragment.DISPLAY_HEIGHT);
            mMediaRecorder.setOutputFile(path);
    }


    private VirtualDisplay createVirtualDisplay() {
        return mMediaProjection.createVirtualDisplay("MainActivity",
                MainFragment.DISPLAY_WIDTH, MainFragment.DISPLAY_HEIGHT, MainFragment.screenDensity,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                mMediaRecorder.getSurface(), null /*Callbacks*/, null /*Handler*/);
    }

public class MediaProjectionCallback extends MediaProjection.Callback {
        @Override
        public void onStop() {
            mMediaRecorder.stop();
            // mMediaRecorder.reset();
            mMediaRecorder.release();
            mMediaProjection.unregisterCallback(callback);
            mMediaProjection = null;
            mMediaRecorder = null;
        }

很抱歉回答晚了,但这里有一个工作代码。它将在棒棒糖及以上的食物上起作用

    private VirtualDisplay mVirtualDisplay;
    private MediaRecorder mMediaRecorder;
    private MediaProjection mMediaProjection;
    private MediaProjectionCallback callback;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MediaProjectionManager projectionManager = (MediaProjectionManager) 
        context.getSystemService(Context.MEDIA_PROJECTION_SERVICE);
        mMediaProjection.registerCallback(callback, null);
        initRecorder();
        mMediaRecorder.prepare();
        mVirtualDisplay = createVirtualDisplay();
        mMediaRecorder.start();
}

public void initRecorder() {
        path = "/sdcard/Record/video" + ".mp4";
        recId = "capture-" + System.currentTimeMillis() + ".mp4";
        File myDirectory = new File(Environment.getExternalStorageDirectory(), "Record");

            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            mMediaRecorder.setVideoEncodingBitRate(MainFragment.bitRate);          
            mMediaRecorder.setVideoFrameRate(30);
            mMediaRecorder.setVideoSize(MainFragment.DISPLAY_WIDTH,
            MainFragment.DISPLAY_HEIGHT);
            mMediaRecorder.setOutputFile(path);
    }


    private VirtualDisplay createVirtualDisplay() {
        return mMediaProjection.createVirtualDisplay("MainActivity",
                MainFragment.DISPLAY_WIDTH, MainFragment.DISPLAY_HEIGHT, MainFragment.screenDensity,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                mMediaRecorder.getSurface(), null /*Callbacks*/, null /*Handler*/);
    }

public class MediaProjectionCallback extends MediaProjection.Callback {
        @Override
        public void onStop() {
            mMediaRecorder.stop();
            // mMediaRecorder.reset();
            mMediaRecorder.release();
            mMediaProjection.unregisterCallback(callback);
            mMediaProjection = null;
            mMediaRecorder = null;
        }

检查并感谢,但我已经阅读了这些链接但没有帮助检查并感谢,但我已经阅读了这些链接但没有帮助谢谢。应用程序不需要像根一样的简易屏幕记录器。应用程序不需要像根一样的简易屏幕录制器当简易屏幕录制器是如何创建的?这个应用程序做了我想做的。我提到了我的问题中的API,它的意思是我在编程上谈论它在谷歌商店中的每一个应用程序,它们是由C++中的本地应用程序写的。没有办法在android中记录屏幕在android中是不可能的?NDK允许您使用C编写部分应用程序。我猜C库提供了对视频帧缓冲区的访问。EASY screen recorder的人说,如果你不想根设备,那么你必须一次性连接到PC并从那里运行安装程序。我的猜测是,安装程序以某种方式将NDK部分安装到手机上。好的,但easy screen recorder能够录制屏幕,但他们是以何种方式录制的。在C++或C中编写代码,如果不是在Android中,那么应用的屏幕记录器是如何创建的?本申请书
在我的问题中,我提到了API,它的意思是我在编程上谈论它在谷歌商店中的每一个应用程序,它们都是由C++中的本地应用程序编写的。没有办法在android中记录屏幕在android中是不可能的?NDK允许您使用C编写部分应用程序。我猜C库提供了对视频帧缓冲区的访问。EASY screen recorder的人说,如果你不想根设备,那么你必须一次性连接到PC并从那里运行安装程序。我的猜测是,安装程序以某种方式将NDK部分安装到手机上。好的,但easy screen recorder能够录制屏幕,但他们是以何种方式录制的。在C++或C中编写代码,如果它不在ANDROID中,则不能从Survivew中记录。但您可以将SurfaceView的Surface替换为MediaRecorder或MediaCodec的Surface输入。您不能从SurfaceView录制。但您可以将SurfaceView的表面替换为MediaRecorder或MediaCodec的表面输入。