具有 Surface 输入的 MediaCodec:生成分块输出

2023-11-22

我正在尝试通过 CameraPreview 数据生成短的连续 mp4 文件MediaCodec.createInputSurface()。然而,重新创建MediaCodec与其关联的 Surface 需要停止相机以允许再次调用mCamera.setPreviewTexture(...)。这种延迟会导致大量的丢帧。

因此我需要生成CODEC_CONFIG and END_OF_STREAM定期数据,无需重新创建输入 Surface,因此必须调用mCamera.setPreviewTexture(...)。这是否可能假设MediaFormat不变吗?

(我正在改编法登的相机转MPEG测试例子。我的完整代码是here)

不成功的尝试:

Calling MediaCodec.signalEndOfInputStream(),排空MediaCodec,然后调用MediaCodec.flush()块之间产生一个IllegalStateException2 日致电MediaCodec.signalEndOfInputStream().

Calling MediaCodec.signalEndOfInputStream(),排空MediaCodec,然后调用MediaCodec.stop(); MediaCodec.configure(...), MediaCodec.start()块之间无需再次调用MediaCodec.createInputSurface()产生以下错误:

    09-30 13:12:49.889  17638-17719/x.xx.xxxx E/Surface﹕ queueBuffer: error queuing buffer to SurfaceTexture, -19
09-30 13:12:49.889  17638-17719/x.xx.xxxx E/IMGSRV﹕ :0: UnlockPostBuffer: Failed to queue buffer 0x592e1e70
09-30 13:12:49.889  17638-17719/x.xx.xxxx E/CameraToMpegTest﹕ Encoding loop exception!
09-30 13:12:49.889  17638-17719/x.xx.xxxx W/System.err﹕ java.lang.RuntimeException: eglSwapBuffers: EGL error: 0x300b
09-30 13:12:49.896  17638-17719/x.xx.xxxx W/System.err﹕ at x.xx.xxxx.ChunkedHWRecorder$CodecInputSurface.checkEglError(ChunkedHWRecorder.java:731)
09-30 13:12:49.896  17638-17719/x.xx.xxxx W/System.err﹕ at x.xx.xxxx.ChunkedHWRecorder$CodecInputSurface.swapBuffers(ChunkedHWRecorder.java:713)
09-30 13:12:49.896  17638-17719/x.xx.xxxx W/System.err﹕ at x.xx.xxxx.ChunkedHWRecorder.startRecording(ChunkedHWRecorder.java:164)
09-30 13:12:49.896  17638-17719/x.xx.xxxx W/System.err﹕ at x.xx.xxxx.HWRecorderActivity$CameraToMpegWrapper.run(HWRecorderActivity.java:76)
09-30 13:12:49.896  17638-17719/x.xx.xxxx W/System.err﹕ at java.lang.Thread.run(Thread.java:841)

Solved谢谢法登。完整的解决方案源码是here.


The signalEndOfInputStream()调用更新 MediaCodec 堆栈中各个层的状态。您可以从测试上方的注释中了解哪些操作是有效的媒体编解码器测试,但总的来说,MediaCodec 的行为根本不是为“不寻常”用途而定义的。

所以你必须看代码。输入表面的寿命与OMX节点实例;它的代表是图形缓冲区源。一旦您发出 EOS 信号,GraphicBufferSource 将忽略其他帧(请参阅line 426)。没有办法在不拆除 GraphicBufferSource 的情况下重置 EOS 标志,但是当您这样做时,它会断开 Surface 下的缓冲区队列。

因此,我认为您无法停止/重新启动 MediaCodec 并继续使用 Surface。

然而...你不应该需要这样做。 CameraToMpegTest 将相机预览路由到 SurfaceTexture,然后使用 GLES 将纹理渲染到编码器的输入表面上。 SurfaceTexture 与编码器分离,不需要更改。我认为需要改变的是CodecInputSurface,它调用eglCreateWindowSurface()使用 MediaCodec 中的 Surface 来告诉 GLES 在哪里绘制。如果您在那里添加一个新的“更新 Surface”API(销毁旧的 EGLSurface,创建新的 EGLSurface,eglMakeCurrent),并在每次启动新的 MediaCodec 时调用它,我think一切都会顺利的。

更新以解决评论:

重要的是您只更改EGLSurface. The checkAndUpdateEglStateLocked()函数于GLConsumer.cpp检查以确保EGLDisplay and EGLContext一旦设置就不要更改。你不能打电话release()/eglSetup()在 CodecInputSurface 中,因为它改变了EGLContext。你只想摧毁并重建EGLSurface.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有 Surface 输入的 MediaCodec:生成分块输出 的相关文章

随机推荐

  • 在 Visual Studio Code 中以编程方式检测亮/暗主题

    我正在开发 Visual Studio Code扩大可以预览mermaid图表 该扩展使用默认样式表 如果使用浅色主题 该样式表可以正常工作 但是 如果用户已将 Visual Studio Code 切换为使用深色主题 则样式表中的一些规则
  • 使用 JavaScript 访问 iPhone 指南针

    知道是否可以使用 JavaScript 在 Safari 中访问 iPhone 指南针 我懂了如何访问 GPS 但我认不出指南针 On iOS 您可以检索compass像这样的值 window addEventListener device
  • 遍历目录树的方式有哪几种?

    如何用您最喜欢的语言遍历目录树 要在不同操作系统中遍历目录树 您需要了解什么 在不同的文件系统上 您最喜欢的帮助遍历目录树的库 模块是什么 In Python 如果您正在寻找快速 干净且便携的解决方案 请尝试 import os base
  • 将created_at和updated_at字段添加到mongoose模式

    有没有办法添加created at和updated at字段到猫鼬模式 而不必每次都将它们传递给新的MyModel 叫做 The created at字段将是一个日期 并且仅在创建文档时添加 这updated at字段将在任何时候更新为新日
  • 爪哇。比较字符串时忽略重音符号

    问题很简单 JAVA中有没有函数可以比较两个字符串并返回true 忽略重音字符 ie String x Joao String y Jo o 返回相等的 Thanks 我认为你应该使用Collator班级 它允许您设置强度和区域设置 并且它
  • 绝对/相对定位布局溢出

    在相当长的一段时间里 我一直在摆弄一个特定的布局问题 但我显然采用了错误的方式 以下是该方法的基本组成部分 div class stretched div class header SOME HEADER div div class som
  • 身份验证失败:Devise + OmniAuth + Twitter

    我正进入 状态 twitter Authentication failure invalid credentials OAuth Unauthorized 401 Unauthorized成功登录 Twitter 并且页面重定向到登录页面后
  • Hibernate Oracle 表空间注释

    我正在注释我的 DAO 并使用 hibernate3 hbm2ddl 生成 ddls 有没有办法注释表空间 不 没有办法开箱即用 我过去使用以下相当复杂的方法解决了这个问题 创建您自己的注释 TableSpec具有表空间和其他必要的属性 E
  • 复选框的 CSS 边框

    我正在应用 jQuery 复选框的样式 reg checkbox css border thin solid red 边框在 IE 中工作正常 但在 mozilla 中不行 如何使其兼容浏览器 使用大纲 http jsfiddle net
  • Visual Studio 组件缓存已过期

    几乎每次我尝试运行 EF 迁移的 update database 命令时 我都会在 Visual Studio 2015 中收到以下错误 使用 1 个参数调用 GetService 时发生异常 异常 使用 2 个参数调用 Invoke Vi
  • iOS Swift Flood 填充算法

    我为接触点的 桶填充 洪水填充 创建了这个扩展 extension UIImageView func bucketFill startPoint CGPoint newColor UIColor var newRed newGreen ne
  • 如何将模型从一个 Django 应用程序迁移到新的应用程序中?

    我有一个 Django 应用程序 里面有四个模型 我现在意识到这些模型之一应该位于单独的应用程序中 我确实安装了 South 用于迁移 但我不认为这是它可以自动处理的事情 如何将旧应用程序中的模型之一迁移到新应用程序中 另外 请记住 我需要
  • 当没有指定值时,是否应该跳过验证?

    我在 GlassFish 3 上使用 JSF2 我有一个接受可选电话号码的表格 我有这个自定义电话号码验证器 如下 并且我将该字段设置为 required false 因为电话号码在表单中是可选的 问题是 该领域的价值总是得到验证 当没有指
  • ASP.net 对根证书存储的权限

    是否可以授予 asp net 对证书存储的读取权限 如果是 怎么办 如果否 我是否需要为每个证书文件手动设置权限 如果是 这些文件在硬盘上的物理位置在哪里 一般来说 您授予权限A证书 我使用这样的方法来查找定制的证书并授予权限 如果您使用的
  • AngularJs 指令内的数据绑定

    我很难弄清楚如何确保在创建指令时维护双向数据绑定 这是我正在使用的东西和小提琴 http jsfiddle net dkrotts ksb3j 6 HTML
  • ASP.NET Core MVC,从数据库获取文件并渲染为图像

    我将图像数据存储在 SQL 表中 字段类型为varbinary 最大 我还存储图像内容类型 使用 Microsoft ASP NET Core MVC 和 Dapper 我尝试从数据库中获取文件并将其呈现为图像 这是我的文件模型 using
  • 如何使用base64设置图像源

    我想将图像源设置为 base64 源 但它不起作用 JSfiddle net NT9KB img src JavaScript document getElementById img src data image png base64 iV
  • 测试使用 Flask-WTF validate_on_submit 的 POST

    我很难测试 POST 以将类别添加到数据库 在该数据库中我使用 Flask WTF 进行验证和 CSRF 保护 对于CRUD操作请pm我的网站 我使用过 Flask Flask WTF 和 Flask SQLAlchemy 这是我的第一个独
  • 将数据从一个数据库传输到另一个数据库

    如何从一个数据库中取出数据并插入到另一个数据库表中 我不能这样做 请帮助我将数据从一个设备传输到另一个设备 有多种方法可以做到这一点 以下是两个选项 选项1 右键单击 要复制的数据库 选择 任务 gt 生成脚本 选择特定数据库对象 检查 表
  • 具有 Surface 输入的 MediaCodec:生成分块输出

    我正在尝试通过 CameraPreview 数据生成短的连续 mp4 文件MediaCodec createInputSurface 然而 重新创建MediaCodec与其关联的 Surface 需要停止相机以允许再次调用mCamera s