如何在android中录制视频的同时在视频上绘图,并保存视频和绘图?

2024-04-20

我正在尝试开发一款应用程序,允许我在录制视频时在视频上绘图,然后将录制内容和视频保存在一个 mp4 文件中以供以后使用。另外,我想使用camera2库,特别是我需要我的应用程序在高于API 21的设备上运行,并且我总是避免使用已弃用的库。

我尝试了很多方法来做到这一点,包括在 FFmpeg 中放置了 TextureView.getBitmap() (来自相机)的叠加层和从画布中获取的位图。它有效,但由于它是一个缓慢的功能,视频无法捕获足够的帧(甚至不到 25 fps),而且运行速度非常快。我希望也包括音频。

我考虑过 MediaProjection 库,但我不确定它是否可以捕获包含相机的布局和仅在其 VirtualDisplay 内的绘图,因为应用程序用户也可以在视频上添加文本,而且我不想要键盘出现。

请帮助,已经进行了一周的研究,但我发现没有什么对我有用的。

P.S:如果用户按下“停止录制”按钮后包含一点处理时间,我不会有问题。

EDITED:

现在,在 Eddy 的回答之后,我正在使用 Shadercam 应用程序在相机表面上绘图,因为该应用程序执行视频渲染,而要做的解决方法是将我的画布渲染为位图,然后渲染为 GL 纹理,但是我无法成功地做到这一点。我需要你们的帮助,我需要完成应用程序:S

我正在使用shadercam库(https://github.com/googlecreativelab/shadercam https://github.com/googlecreativelab/shadercam),我用以下代码替换了“ExampleRenderer”文件:

public class WriteDrawRenderer extends CameraRenderer
{
    private float offsetR = 1f;
    private float offsetG = 1f;
    private float offsetB = 1f;

    private float touchX = 1000000000;
    private float touchY = 1000000000;

    private  Bitmap textBitmap;

    private int textureId;

    private boolean isFirstTime = true;

    //creates a new canvas that will draw into a bitmap instead of rendering into the screen
    private Canvas bitmapCanvas;

    /**
     * By not modifying anything, our default shaders will be used in the assets folder of shadercam.
     *
     * Base all shaders off those, since there are some default uniforms/textures that will
     * be passed every time for the camera coordinates and texture coordinates
     */
    public WriteDrawRenderer(Context context, SurfaceTexture previewSurface, int width, int height)
    {
        super(context, previewSurface, width, height, "touchcolor.frag.glsl", "touchcolor.vert.glsl");
        //other setup if need be done here


    }

    /**
     * we override {@link #setUniformsAndAttribs()} and make sure to call the super so we can add
     * our own uniforms to our shaders here. CameraRenderer handles the rest for us automatically
     */
    @Override
    protected void setUniformsAndAttribs()
    {
        super.setUniformsAndAttribs();

        int offsetRLoc = GLES20.glGetUniformLocation(mCameraShaderProgram, "offsetR");
        int offsetGLoc = GLES20.glGetUniformLocation(mCameraShaderProgram, "offsetG");
        int offsetBLoc = GLES20.glGetUniformLocation(mCameraShaderProgram, "offsetB");

        GLES20.glUniform1f(offsetRLoc, offsetR);
        GLES20.glUniform1f(offsetGLoc, offsetG);
        GLES20.glUniform1f(offsetBLoc, offsetB);

        if (touchX < 1000000000 && touchY < 1000000000)
        {
            //creates a Paint object
            Paint yellowPaint = new Paint();
            //makes it yellow
            yellowPaint.setColor(Color.YELLOW);
            //sets the anti-aliasing for texts
            yellowPaint.setAntiAlias(true);
            yellowPaint.setTextSize(70);

            if (isFirstTime)
            {
                textBitmap = Bitmap.createBitmap(mSurfaceWidth, mSurfaceHeight, Bitmap.Config.ARGB_8888);
                bitmapCanvas = new Canvas(textBitmap);
            }

            bitmapCanvas.drawText("Test Text", touchX, touchY, yellowPaint);

            if (isFirstTime)
            {
                textureId = addTexture(textBitmap, "textBitmap");
                isFirstTime = false;
            }
            else
            {
                updateTexture(textureId, textBitmap);
            }

            touchX = 1000000000;
            touchY = 1000000000;
        }
    }

    /**
     * take touch points on that textureview and turn them into multipliers for the color channels
     * of our shader, simple, yet effective way to illustrate how easy it is to integrate app
     * interaction into our glsl shaders
     * @param rawX raw x on screen
     * @param rawY raw y on screen
     */
    public void setTouchPoint(float rawX, float rawY)
    {
        this.touchX = rawX;
        this.touchY = rawY;
    }
}

请帮助大家,已经一个月了,我仍然坚持使用同一个应用程序:(并且对 opengl 不了解。两周了,我尝试在我的应用程序中使用这个项目,但视频上没有渲染任何内容。

提前致谢!


这是一个应该可行的粗略轮廓,但这需要相当多的工作:

  1. 设置 android.media.MediaRecorder 来录制视频和音频
  2. 从 MediaRecorder 获取 Surface 并从中设置 EGLImage (https://developer.android.com/reference/android/opengl/EGL14.html#eglCreateWindowSurface(android.opengl.EGLDisplay https://developer.android.com/reference/android/opengl/EGL14.html#eglCreateWindowSurface(android.opengl.EGLDisplay, android.opengl.EGLConfig, java.lang.Object, int[], int) );为此,您需要完整的 OpenGL 上下文和设置。然后您需要将该 EGLImage 设置为渲染目标。
  3. 在该 GL 上下文中创建 SurfaceTexture。
  4. 配置相机将数据发送到该 SurfaceTexture
  5. 启动媒体记录器
  6. 在从相机接收到的每一帧上,将用户完成的绘图转换为 GL 纹理,并将相机纹理和用户绘图进行合成。
  7. 最后调用glSwapBuffers将合成帧发送到录像机
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在android中录制视频的同时在视频上绘图,并保存视频和绘图? 的相关文章

  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • android:widgetLayout 和 android:layout 之间的区别?

    我得到一些奇怪的配置 其中 widgetLayout 配置列表项的内部空间 而布局配置整个项目列表和屏幕背景 有人能真正解释一下什么是 widgetLayout 吗 android layout 整个首选项的布局 包括标题 摘要和小部件 a
  • 即使获得平台签名也无法读取系统文件

    我已经构建了一个自定义 Android ROM 我已经使用平台签名签署了我的应用程序并添加了android sharedUserId android uid system 在清单文件中 我的应用程序被授予所有 签名 和 系统 级别权限 但不
  • 将样式应用于警报对话框

    我决定尝试材质警报dialogs https material io develop android components dialog 在安卓上 我遇到的问题是当我尝试应用某些样式时 检查文档 我发现了这个
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • android studio logcat 中字母的含义是什么? [复制]

    这个问题在这里已经有答案了 在 android studio 中运行应用程序时 会生成 logcat 并且每行的开头都有字母 这些字母的含义是什么 这些字母表用于各种日志选项 请参阅此链接 日志选项 https developer andr
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • MPAndroidChart StackedBarChart 显示值但不显示条形图

    我开始使用MPAndroidChart https github com PhilJay MPAndroidChart图书馆来建立一个StackedBarChart显示三个 y 值 这是代码 public class Plot final
  • 在 PHP 中设置通知的 FCM 通道 ID

    我正在尝试使用 PHP 向 Android 设备发送 FCM 通知 我的代码适用于 Android O 之前的设备 在Android O中 我们还需要在请求中设置通道ID来接收通知 我不知道该怎么做 我已在应用程序中完成了必要的设置 并使用
  • 通用 JSF 实体转换器[重复]

    这个问题在这里已经有答案了 我正在编写我的第一个 Java EE 6 Web 应用程序作为学习练习 我没有使用框架 只是使用 JPA 2 0 EJB 3 1 和 JSF 2 0 我有一个自定义转换器 用于将存储在 SelectOne 组件中
  • 存储过程将多个表返回到 spring jdbc 模板

    我正在使用 JdbcTemplate 从 Spring DAO 类调用存储过程 我的问题是 存储过程返回多个表 有没有办法使用 Spring JdbcTemplate 访问多个表 如果我使用jdbcTemplate queryForList
  • 用 Java 创建迷宫求解算法

    我被分配了用 Java 创建迷宫求解器的任务 这是任务 Write an application that finds a path through a maze The maze should be read from a file A
  • 是什么原因导致“对象不是声明类的实例”? [复制]

    这个问题在这里已经有答案了 可能的重复 使用反射调用方法时 为什么会出现 对象不是声明类的实例 https stackoverflow com questions 7202988 why do i get object is not an
  • RMI 服务器:rmiregistry 或 LocateRegistry.createRegistry

    对于服务器端的RMI 我们需要启动吗rmiregistry程序 或者只是调用LocateRegistry createRegistry 如果两者都可以的话 各有什么优点和缺点 他们是同一件事 rmiregistry是一个单独的程序 您可以从
  • Android:如何为我的应用程序播放的任何音乐文件创建淡入/淡出音效?

    我正在开发的应用程序播放音乐文件 如果计时器到期 我希望音乐淡出 我怎么做 我正在使用 MediaPlayer 播放音乐 音乐文件位于我的应用程序的原始文件夹中 这是我的 Android MediaPlayer 的整个处理程序类 查看 pl
  • 如何自动更新Android Studio?

    我需要将 Android Studio 更新到 0 9 9 版本 但是当我按 下载 在更新信息对话框上 时 它会将我发送到此处 http developer android com sdk index html http developer
  • ActionBar 中的进度条

    我正在使用一个应用程序 它将在应用程序内部加载一个网站 现在我想在操作栏中添加一个进度栏 而无需向上滑动来抑制功能 像那样 我在用Fragment在我的应用程序中 WebviewFragment public class WebviewFr
  • Java泛型类型

    当我有一个界面时 public interface Foo
  • 从 Android 中的过渡动画中排除 BottomNavigation

    我一直在四处寻找 但找不到有助于解决这个特定问题的答案 我的应用程序有一个自定义滑入 滑出效果 如下所示 Intent intent new Intent getApplicationContext MyActivity class sta
  • 将隐藏(生物识别)数据附加到 pdf 上的数字签名

    我想知道是否可以使用 iText 我用于签名 或 Java 中的其他工具在 pdf 上添加生物识别数据 我会更好地解释一下 在手写板上签名时 我会收集签名信息 例如笔压 签名速度等 我想将这些信息 java中的变量 与pdf上的签名一起存储

随机推荐

  • 递归函数:检查 Java 中的回文数

    我有一个类检查字符串是否是回文 我有两个问题 1 这是检查回文的最有效方法吗 2 这可以递归实现吗 public class Words public static boolean isPalindrome String word Stri
  • 在 Python 中继承方法的文档字符串

    我有一个带有文档字符串的面向对象层次结构 需要与代码本身一样多的维护 例如 class Swallow object def airspeed self Returns the airspeed unladen raise NotImple
  • Swift Firebase 访问子快照数据

    我目前正在尝试从 Swift 中的子快照访问数据 这是我的代码 在 Swift 3 Firebase 更新之前有效 if let achievements snapshot1 childSnapshotForPath Achievement
  • 如何动态地将 OR 运算符添加到 LINQ 中的 WHERE 子句

    我有一个可变大小的字符串数组 我试图以编程方式循环遍历该数组并匹配表中的所有行 其中 Tags 列至少包含数组中的一个字符串 这是一些伪代码 IQueryable
  • 在 Google Compute Engine 虚拟机之间共享永久性磁盘

    来自谷歌的文档 可以将永久磁盘附加到多个实例 但是 如果您将永久磁盘附加到多个实例 则所有实例都必须以只读模式附加永久磁盘 无法以读写模式将永久磁盘附加到多个实例 如果您以读写模式附加永久磁盘 然后尝试将该磁盘附加到后续实例 Google
  • FileOutputStream (Apache POI) 保存时间过长

    当我使用 Apache poi 编辑 xlsx 文件时 保存时间太长 xlsx 文件包含公式格式设置和冻结窗格 我正在使用以下代码 try FileInputStream file new FileInputStream new File
  • 确定 Base64 字符串或缓冲区是否包含没有元数据的 JPEG 或 PNG?可能的?

    有没有办法使用节点来做到这一点 无论是本机还是通过插件 我想要完成的是根据输入类型选择无损或有损图像压缩 对大型 JPEG 进行无损存储是一场存储灾难 PNG 文件的前八个字节始终包含以下值 请参阅PNG规格 http www libpng
  • Subversion (svn + tortoiseSvn) 提交未锁定文件

    我经历过颠覆的奇怪功能 我们使用最新的 1 6 Svn 服务器 Visualsvn 和 tortoisesvn 1 6 6 我们已经为文件定义了属性 svn needs lock 那么如果您从不同位置复制文件 它会显示本地更改 如果您尝试提
  • 如何实现固定长度的空间金字塔池化层?

    我想实现所介绍的空间金字塔池层在本文中 https arxiv org pdf 1406 4729v4 pdf 正如论文设置 关键点是定义 max pooling 层的变体内核大小和步幅大小 即 kernel size ceil a n s
  • 使用 jack 时,Lambda 表达式会在 Android 中崩溃并出现 IncompleteClassChangeError

    我在我的 Android 项目中使用 Java 8 我已经设置了 Jack 在 android 应用程序模块中 和 Retrolambda 在其他模块中 我遇到的问题是 当我尝试使其使用类变量 并且我可以在任何模块中重现它 时 我的 Lam
  • fork() & 内存分配行为

    我在一个禁用交换和禁用内存过量使用的系统上工作 假设我的进程当前消耗 100 MB 内存 而系统可用内存小于 100 MB 如果我执行 fork 它会失败 因为内核也尝试为子进程分配 100 MB 的空间吗 我读过 Linux 在分叉时使用
  • iOS 7 下 UITableView 部分索引相关崩溃

    我有一个简单的表视图部分索引 第一次看起来很好 但如果发生某些类型的交互 强制重新绘制部分索引 则崩溃 方法是 通过点击其中一个单元格来推动视图控制器 点击表视图标题中的搜索栏或以其他方式使其成为第一响应者 转到信息屏幕 然后返回带有该表视
  • 如何更改sqlite中的数据库名称?

    我必须简单地更改数据库名称 但似乎ALTER DATABASE命令在 SQLite 中无效 我的场景是我有一个 SQLite 加密数据库 现在我想重命名它 手动重命名 db 文件后 加密不起作用 所以我尝试使用命令更改数据库的名称 看起来问
  • 如何修复错误:spawnSync powershell.exe ENOENT

    我想使用以下命令通过提升的 PowerShell 控制台安装 Windows 构建工具 npm install global production windows build tools 但每次运行时我都会收到以下错误npm install
  • 如何解决这个java.lang.RuntimeException?

    Google 开发者控制台显示我的应用程序在过去一个月中收到了两个相同的错误 但是这个RuntimeException没有指定错误源自的类或文件 我看不出什么具体的东西 以下是两种不同设备的错误 三星 Galaxy S8 Active cr
  • 在反应本机地图上显示用户位置

    如何在 React Native 地图上显示用户位置
  • 如何以编程方式更改 log4j2 中的 AppenderRef Level?

    我怎样才能改变AppenderRef Level在 log4j2 中 有一个堆栈溢出问题 https stackoverflow com questions 41427352 带答案 这是通过非编程方式解决的 我想要相同的但以编程方式代替
  • Google App Engine 是否识别并使用 .htaccess 文件?

    我正在使用 Google App Engine Launcher 在本地测试我的应用程序localhost 8080 我猜 Google App Engine Launcher 使用 Python 在本地运行服务器 但我读过 htacces
  • 如何将 ChromeDriver 包含在 JAR 中?

    我正在编写一个网络自动化程序 到目前为止 它使用 Selenium 的 FirefoxDriver 运行良好 但是 如果未安装 Firefox 我想让它使用 Chrome 我下载了 ChromeDriver 将其放入 Eclipse 项目的
  • 如何在android中录制视频的同时在视频上绘图,并保存视频和绘图?

    我正在尝试开发一款应用程序 允许我在录制视频时在视频上绘图 然后将录制内容和视频保存在一个 mp4 文件中以供以后使用 另外 我想使用camera2库 特别是我需要我的应用程序在高于API 21的设备上运行 并且我总是避免使用已弃用的库 我