【问题标题】:Need to draw to surface used by MediaRecorder需要绘制到 MediaRecorder 使用的表面
【发布时间】:2016-06-07 23:34:37
【问题描述】:

我需要录制一个仅包含一个帧的视频:用户指定的图像(可以是任意长度,但只有相同的静态图像)。所以,我想我可以使用新的 MediaRecorder.VideoSource.SURFACE 并绘制到记录器正在使用的 Surface 上。我正确初始化了记录器,我什至可以毫无例外地调用 MediaRecorder.getSurface()(这显然很棘手)。

我的问题有点尴尬:我不知道如何处理返回的表面。我需要以某种方式绘制它,但我能找到的所有示例都涉及绘制到 SurfaceView。这个表面是否与 MediaRecorder.setPreviewDisplay() 使用的表面相同?我如何在上面画一些东西?

【问题讨论】:

    标签: android surfaceview android-mediarecorder


    【解决方案1】:

    理论上,如果您想在软件中进行渲染,您可以使用Surface#lockCanvas() 获取 Canvas 进行绘制。在某些平台上曾经有problems with this;不确定是否已修复。

    另一种选择是从 Surface 创建一个 EGLSurface 并使用 OpenGL ES 在其上进行渲染。您可以在Grafika 中找到这方面的示例,以及一些用于管理所有 EGL 设置的代码。

    GLES 录制示例使用 MediaCodec 而不是 MediaRecorder,但思​​路是一样的,使用 MediaRecorder 应该会简单得多。

    【讨论】:

    • 我刚刚尝试过:开始录制后,我调用了lockCavas(),在画布上画了一条线,然后调用了unlockAndPostCanvas()。但是,当我停止录制时,我得到了一个 RuntimeException,根据文档,这意味着没有收到用于录制的有效数据。我没有遇到您发布的链接中颜色偏移不正确的问题。有什么想法吗?
    • 颜色通道反转是一种可能的结果;彻底失败是另一回事。听起来你需要走 GLES 路线。 (可以使用软件渲染来创建屏幕外位图,将位图上传为带有glTexImage2D() 的纹理,然后进行渲染……因此您无需将所有渲染转换为 GLES 命令。)如果您从 Grafika 中的代码开始,只需 glClear() 和剪刀矩形在屏幕上绘制彩色矩形,应该可以在不做任何事情的情况下进行测试,而无需将您的脚趾伸入 GLES。
    • 在 Grafika 示例中可以使用 MediaRecorder 而不是 MediaCodec,但是当 MediaRecorder 使用音频源 stackoverflow.com/questions/63467704/… 准备时会出现问题,因此只有使用 mediarecording(无音频)录制视频时才可以使用
    • @fadden 可以帮助我使用 MediaRecorder。为什么使用音频录制时会出现问题? stackoverflow.com/questions/63467704/…
    猜你喜欢
    • 1970-01-01
    • 2013-04-08
    • 2015-05-11
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 2016-02-12
    • 2021-03-28
    相关资源
    最近更新 更多