【问题标题】:Screen Recorder in Android Programmactically, not Screen shotsAndroid中的屏幕录像机以编程方式,而不是屏幕截图
【发布时间】:2014-09-02 04:45:54
【问题描述】:

我想让应用程序像“EASY 屏幕录像机”。我必须从哪里开始,因为我搜索了很多,但没有找到任何开始的链接。有任何 api 用于创建屏幕录像机而不是屏幕截图。我不想使用 javacv 从屏幕截图创建视频。我只想让用户启动应用程序并单击开始录制按钮,然后用户在移动设备上所做的一切都会记录下来。

1) android 中有没有这方面的 api。

2) 我如何在 android 中创建屏幕录像机应用程序。

3) android中是否没有任何api,请参考其他api,以便我可以在android中使用。

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

EASY 屏幕录像机开发者如何创建这个应用程序?他们使用了哪个 api。我想创建这个应用程序的克隆。

【问题讨论】:

  • 检查thisthis
  • 谢谢,但我已经阅读了这些链接,但没有帮助

标签: android android-layout android-intent android-activity android-fragments


【解决方案1】:

很抱歉回答迟了,但这是一个有效的代码。它适用于Lollipop 及以上

    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;
        }

【讨论】:

    【解决方案2】:

    根据 Android 5.0,您将能够通过 MediaProjection API 捕获屏幕内容,并且您无需 root 设备。尝试在 SurfaceView 上投影并从那里记录。

    【讨论】:

    • 您无法从 SurfaceView 录制。但是您可以将 SurfaceView 的 Surface 替换为 MediaRecorder 或 MediaCodec 的 Surface 输入。
    • 可以分享一下如何更换surfaceview的surface吗?
    【解决方案3】:

    几乎没有变通方法 - 不需要您对设备进行 root)。

    • 如果您正在为您的应用创建演示,则可以使用模拟器或 bluestack 和桌面屏幕录像机仅录制模拟器。

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

    • 如果您必须捕获屏幕并且可以将手机连接到计算机,您可以以更快的速度从桌面截取手机屏幕的屏幕截图(与 Dalvik 调试监视器设备 > 屏幕截图相同) .),然后将图像组合成电影。

    如果您要创建应用程序,那么您将不得不探索the NDK

    【讨论】:

    • 那么“EASY录屏”是如何应用的呢?这个应用程序做我想做的事。
    • 我在我的问题中提到了 api,这意味着我以编程方式谈论
    • 这意味着谷歌商店中的每个应用程序都是由用 c++ 编写的本机应用程序开发的。没有办法在android中记录屏幕在android中是不可能的?
    • NDK 允许您使用 C 编写应用程序的某些部分。我猜 C 库提供对视频帧缓冲区的访问。 EASY屏幕录像机的人说,如果您不想root设备,那么您必须连接到PC一次并从那里运行安装程序。我的猜测是安装程序以某种方式将 NDK 部分安装到手机上。
    • 好的,但简单的屏幕录像机能够录制屏幕,但他们是以何种方式录制的。如果在 android 中不支持,可以用 c++ 或 c 编写代码
    【解决方案4】:

    Android 不提供任何公开帧缓冲区的 API,您需要 root 设备并可以使用来自 http://code.google.com/p/fastdroid-vnc/ 的一些源代码来获取原始帧缓冲区然后记录它。

    请记住,您需要 root 设备才能执行此操作。

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

    【讨论】:

    • 谢谢。没有像EASY屏幕录像机这样的root应用程序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2017-11-15
    相关资源
    最近更新 更多