android ffmpeg opengl es 渲染电影

2023-12-07

我正在尝试通过 NDK 渲染视频,以添加一些 sdk 中不支持的功能。我正在使用 FFmpeg 来解码视频,并可以通过 ndk 进行编译,并使用this作为起点。我修改了该示例,而不是使用 glDrawTexiOES 来绘制纹理,而是设置了一些顶点并在其之上渲染纹理(opengl es 渲染四边形的方式)。

下面是我正在做的渲染,但是创建 glTexImage2D 很慢。我想知道是否有任何方法可以加快速度,或者给出加快速度的外观,例如尝试在背景中设置一些纹理并渲染预先设置的纹理。或者是否有其他方法可以更快地将视频帧绘制到 Android 屏幕上?目前我只能得到大约12fps。

glClear(GL_COLOR_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D, textureConverted);

//this is slow
glTexImage2D(GL_TEXTURE_2D, /* target */
0, /* level */
GL_RGBA, /* internal format */
textureWidth, /* width */
textureHeight, /* height */
0, /* border */
GL_RGBA, /* format */
GL_UNSIGNED_BYTE,/* type */
pFrameConverted->data[0]);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

EDIT我更改了代码以仅初始化一次gltextImage2D,并使用glSubTexImage2D对其进行修改,它并没有对帧速率产生太大的改进。

然后我修改了代码以修改 NDK 上的本机 Bitmap 对象。通过这种方法,我有一个后台线程运行来处理下一帧并填充本机端的位图对象。我认为这有潜力,但我需要提高将 AVFrame 对象从 FFmpeg 转换为本机位图的速度。下面是我目前正在使用的转换方法,一种暴​​力方法。有什么方法可以提高速度或优化此转换吗?

static void fill_bitmap(AndroidBitmapInfo*  info, void *pixels, AVFrame *pFrame)
{
uint8_t *frameLine;

int  yy;
for (yy = 0; yy < info->height; yy++) {
    uint8_t*  line = (uint8_t*)pixels;
    frameLine = (uint8_t *)pFrame->data[0] + (yy * pFrame->linesize[0]);

    int xx;
    for (xx = 0; xx < info->width; xx++) {
        int out_offset = xx * 4;
        int in_offset = xx * 3;

        line[out_offset] = frameLine[in_offset];
        line[out_offset+1] = frameLine[in_offset+1];
        line[out_offset+2] = frameLine[in_offset+2];
        line[out_offset+3] = 0;
    }
    pixels = (char*)pixels + info->stride;
}
}

是的,纹理(以及缓冲区、着色器和帧缓冲区)创建速度很慢。

这就是为什么你应该只创建一次纹理。创建完成后,可以通过调用修改其数据glSubTexImage2D.

为了使上传纹理数据更快 - 创建两个纹理。当您使用其中一个进行显示时,将纹理数据从 ffmpeg 上传到第二个。当您显示第二个时,将数据上传到第一个。并从头开始重复。

我认为它仍然不会很快。您可以尝试使用 jnigraphics 库,它允许从 NDK 访问位图对象像素。之后 - 您只需在 java 端的屏幕上显示此位图即可。

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

android ffmpeg opengl es 渲染电影 的相关文章

  • Android主线程的IO操作

    我的问题有两个 是否建议在 Android 的主线程上进行 IO 操作 或者它是否有可能导致我的应用程序崩溃 如果在主线程上执行 IO 操作不理想 我可以使用哪些其他框架 以便当我的应用程序加载时它可以执行一些基本的 IO 文件读取并将值存
  • 如何在 Android 中更改 Drawable 的颜色?

    我正在开发一个 Android 应用程序 并且我有一个从源图像加载的可绘制对象 在此图像上 我想将所有白色像素转换为不同的颜色 例如蓝色 然后缓存生成的 Drawable 对象 以便稍后使用它 举例来说 假设我有一个 20x20 PNG 文
  • Android 应用程序安装失败:包 com.my.app 在条目 AndroidManifest.xml 处没有证书

    在 Android Studio 中 我生成了带有密钥库等的签名 APK 将 APK 安装到设备上时失败 并显示 无法安装应用程序 并且在 Android Monitor 中我看到以下行 Package com my app has no
  • 拖动时跳转 ImageView。 getX() 和 getY() 值正在跳跃

    我创建了一个用于拖动视图的 onTouchListener 如果我使用的话 图像可以顺利拖动getRawX and getRawY 问题是 当您向下放置第二个指针然后抬起第一个指针时 图像将跳转到第二个指针 此 onTouchListene
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • 退出设备上的 system.img

    我正在为我们部署给客户的设备 LG p509 Optimus 1 开发自动应用程序更新解决方案 我们可以控制这些设备 并且目前在它们上安装自定义内核 但不是完整的自定义 ROM 由于我们试图在设备上自动更新我们的应用程序 因此我们需要由我们
  • Ionic 2 RC0 和 Angular 2 最新的 Android 构建错误(ngc:错误:静态解析符号值时遇到错误)

    当我使用构建android时出现错误ionic build android命令 ngc 错误 静态解析符号值时遇到错误 引用本地 非导出 符号 字典 考虑导出符号 原始 ts文件中的位置14 8 解析符号TRANSLATION PROVID
  • 错误类型 3 - 活动类不存在

    我正在尝试运行 webRTC 应用程序 但返回以下错误 启动应用程序 com onlinevoicecallapp com onlinevoicecallapp MainActivity 设备外壳命令 am start n com onli
  • ExpandableListview OnGroupClickListener 未触发

    我正在关注这个 以编程方式折叠 ExpandableListView 中的组 https stackoverflow com questions 4314777 programmatically collapse a group in ex
  • 透明 9patch 图像:显示出线条

    我得到了一个透明的 9 补丁图像 其中有 9 条补丁线显示槽 This is the output 显然我不希望水平线可见 这就是我创建 9patch 的方式 This is the final image that is used in
  • 选项卡主机内的 Android Fragment 视图状态 [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Fragment 为 Android 中的每个选项卡单独的返回堆栈 https stackoverflow com questions 6987334 separate back stack f
  • MIUI 权限被拒绝活动 KeyguardLocked

    当应用程序处于后台且屏幕被锁定时 我无法启动活动 没有异常或警告 只是不调用 onCreate 我一直在与这个问题作斗争 我想我终于找到了它的根源 日志中有一行 D com android server am ExtraActivityMa
  • 在android中,将相机预览流到视图上

    我想将 Android 相机的相机预览流式传输到视图上 目的是随后使用 onDraw 将各种内容添加到视图中 我不需要随时实际捕捉图像 它不必是最高质量或每秒最大数量的帧 有谁知道如何做到这一点 将其添加到您的 xml 中
  • 安卓。 CalendarView...一次仅显示一个月的日历

    我正在使用 CalendarView 其中我想一次仅查看一个月的日历并滚动查看下个月 但 CalendarView 一次显示所有月份 下面是我的代码
  • 使用 Play Integrity API 时,Firebase 电话身份验证会出现缺少客户端标识符错误

    使用 Firebase 电话身份验证注册 登录时 身份验证流程始终会启动 reCAPTCHA 流程 并在返回应用程序后发出missing client identifier error 我的设置之前适用于设备验证 安全网络 API 除了我的
  • onTaskRemoved() 在华为和小米设备中没有被调用

    我一直在使用onTaskRemoved 服务中的方法 用于检测应用程序何时通过滑动从设备最近列表中删除 我执行一些日志记录和发生这种情况时需要执行的一些其他操作 它工作完美 然后我在运行Android 6 0的华为设备上检查了这个方法 该方
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • Android-dispatchTouchEvent 给了我一个 StackOverflowError

    这里我有一个带有 setOnTouchListener 的 ViewFlipper 它工作得很好 然后我膨胀 ReLayNewsItem 然后将其添加到 ViewFlipper 现在我希望 WebView web 监听触摸事件并将它们传递给
  • 检查应用程序是否在 Android Market 上可用

    给定 Android 应用程序 ID 包名称 如何以编程方式检查该应用程序是否在 Android Market 上可用 例如 com rovio angrybirds 可用 而 com random app ibuilt 不可用 我计划从
  • 从文件路径显示图像视图?

    我需要仅使用文件名而不是资源 ID 来显示图像 ImageView imgView new ImageView this imgView setBackgroundResource R drawable img1 我在可绘制文件夹中有图像

随机推荐

  • 如何将 Rust 数组转换为指针?

    我在谷歌上找不到简单的东西 如何将简单的 Rust 数组转换为指针 如何获取指向的指针 u8 3 我尝试做as mut u8但这是行不通的 Use as ptr or as mut ptr fn main let a u8 3 1 2 3
  • 重载集合[a, b] (a = b)

    我想重载 Mathematica 的 Set 函数 这对我来说太棘手了 请参阅下面的代码示例 我成功重载了其他函数 例如代码示例中的 Reverse 有什么建议么 In 17 ClearAll struct In 18 var1 struc
  • 以只读方式打开文件

    目前 这就是我打开文件来读取它的方式 using TextReader reader new StreamReader Path Combine client WorkLogFileLoc dump txt do stuff 如何以只读模式
  • 为什么我无法在 Windows 10 计算机中使用 HttpListener? (系统.PlatformNotSupportedException)

    WCF 运行服务器项目时出现 PlatformNotSupportedException这对我不起作用 Console WriteLine System Net HttpListener IsSupported false Code Htt
  • 根据对象字段对 ArrayList 进行排序 [重复]

    这个问题在这里已经有答案了 可能的重复 对联系人数组列表进行排序 我正在存储DataNode中的对象ArrayList The DataNode类有一个名为的整数字段degree 我想找回DataNodeNodeList 中的对象按升序排列
  • 如何在 XSLT 1.0 中执行 for-each-group 而无需键/Muenchian 分组

    我目前正在使用 XSLT 并尝试按属性的子字符串对节点进行分组 唯一的问题是我在无法使用 xsl key 的环境中工作 我想知道对诸如以下内容进行分组的最佳方法
  • div 没有正确从左向右移动

    下面是我的代码片段 我用它来将 div 从左向右移动 https jsfiddle net nf6pqbr0 1 u go click function var stop stopdiv offset left var obj docume
  • 如何使用 Node.js 在 MongoDB 中使用cursor.forEach()?

    我的数据库中有大量文档 我想知道如何遍历所有文档并更新它们 每个文档都有不同的值 答案取决于您使用的驱动程序 我知道的所有 MongoDB 驱动程序都有cursor forEach 以一种或另一种方式实施 这里有些例子 节点 mongodb
  • 将图像水平居中在闪亮的 FluidRow 中

    是否可以在闪亮的 ui FluidPage 中将三个图像排成一行居中 并将每个图像的宽度固定为 300px 要得到 我的一个想法是使用 splitLayout 并以某种方式插入图像作为窗口宽度的函数 但我不确定如何实现这一点 我知道您可以使
  • java.lang.OutOfMemoryError:在 OOM 之前无法分配分配

    实际上 我正在尝试创建一个包含 n 个多媒体文件的应用程序 其中包括图像和视频 我的应用程序大小约为34MB 我的资产规模约为60mb 当我在普通设备中加载应用程序时 我们没有遇到任何问题 但是具有2K resolutions例如Nexus
  • 如何使用“findstr”匹配IP地址?或者 Windows 中任何其他批处理方法

    正如标题所说 我想在windows中批量匹配ip地址 请告诉我该怎么做 我看到 findstr 可以与正则表达式匹配 例如 0 9 但是 findstr 怎么能匹配它出现的情况一到三次 Since findstr的正则表达式支持有点 过时
  • 强制文件下载 PDF“打开方式”框显示它是 Firefox 文档?

    我正在尝试强制下载 PDF 文件 一切正常 唯一的问题是 当它显示 下载框 时 它说它是 Firefox 文档 实际上应该说 Adobe Acrobat 文档 查看图像 下面是我正在使用的代码 1 从gmail强制下载盒子 效果很好 2 从
  • 在 Matlab 中在网格上绘制 3D 条形图

    我有一个矩阵 A 包含 50 行和 4 列 并且条目填充有整数 我的兴趣是根据这些数据构建堆叠的 3D 条形图 但是 使用 bar3 A stacked 创建一行 50 个条形图 而我希望将这些条形图绘制在大小为 5 垂直 x 10 水平
  • Oct 文件在 Octave 3.6.4 或 4.0.0 下运行,但不能同时运行

    我安装了两个版本的 Octave 通过包管理器 Linux Mint Debian 安装的版本 3 6 4 以及从源代码编译的版本 4 0 0 我在 octaverc 文件指向的文件夹中还有许多 oct 文件 我的问题是 4 0 0 版本无
  • 使用列表理解的带有谓词的自定义过滤器函数

    我需要开发自己的过滤功能 类似于filter在 Haskell 中工作 但使用列表理解和谓词 所以我会放lcFilter gt 3 1 2 3 4 5 6 10 444 3 在 ghci 中 它会打印所有大于 3 的数字 我的代码基于我擅长
  • 使用自定义类作为 Q_PROPERTY

    我有两节课TestA and TestB TestA延伸QObject 我已经设置了一些Q PROPERTY就这样 Q PROPERTY QString a string READ getString WRITE setString Q P
  • 如何从链接列表中抓取 HTML 表格

    我正在尝试使用 XML 包抓取一些表 选举数据 浏览后 我发现如何使用以下方法抓取单个网址 library XML url lt http www elecciones2011 gob ar paginas paginas dat99 DP
  • 空手道框架语言支持[重复]

    这个问题在这里已经有答案了 是否可以使用 KARATE 框架编写 C 实用程序 我已经使用 Java 编写了用于自动化 API 的实用程序函数 但现在我想用 C 编写实用程序函数 有没有办法做到这一点 空手道实际上是语言中立的并且使用Ghe
  • 无限循环错误EditText

    首先看我的代码 这些都在我的活动中 EditText text1 text2 Are defined corretly not problem text1 addTextChangedListener new MyTextWatcher o
  • android ffmpeg opengl es 渲染电影

    我正在尝试通过 NDK 渲染视频 以添加一些 sdk 中不支持的功能 我正在使用 FFmpeg 来解码视频 并可以通过 ndk 进行编译 并使用this作为起点 我修改了该示例 而不是使用 glDrawTexiOES 来绘制纹理 而是设置了