当前位置: 首页 > 面试题库 >

如何使ExtractMpegFramesTest中的saveFrame()方法更有效?

卫博
2023-03-14
问题内容

[edit]根据fadden @建议重新格式化为问答格式。

在ExtractMpegFramesTest_egl14.java.txt,方法saveFrame(),有重新排序RGBA到ARGB为位图PNG压缩循环(见下从该文件包括引号),这可怎么优化?

// glReadPixels gives us a ByteBuffer filled with what is essentially big-endian RGBA
// data (i.e. a byte of red, followed by a byte of green...).  We need an int[] filled
// with little-endian ARGB data to feed to Bitmap.
//

// So... we set the ByteBuffer to little-endian, which should turn the bulk IntBuffer
// get() into a straight memcpy on most Android devices.  Our ints will hold ABGR data.
// Swapping B and R gives us ARGB.  We need about 30ms for the bulk get(), and another
// 270ms for the color swap.

for (int i = 0; i < pixelCount; i++) {
    int c = colors[i];
    colors[i] = (c & 0xff00ff00) | ((c & 0x00ff0000) >> 16) | ((c & 0x000000ff) << 16);
}

问题答案:

事实证明,有一种更快的方法

使用@elmiguelao答案中的建议,我修改了片段着色器以进行像素交换。这使我可以从saveFrame()中删除交换代码。由于不再需要内存中像素的临时副本,因此我int[]完全取消了缓冲区,从此切换:

int[] colors = [... copy from mPixelBuf, swap ...]
Bitmap.createBitmap(colors, mWidth, mHeight, Bitmap.Config.ARGB_8888);

对此:

Bitmap bmp = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
bmp.copyPixelsFromBuffer(mPixelBuf);

一旦我这样做,我所有的颜色都是错误的。

事实证明,Bitmap#copyPixelsFromBuffer()想要的像素是RGBA顺序, 而不是
ARGB顺序。输出的值glReadPixels()已经采用正确的格式。因此,通过这种方式,我避免了交换,避免了不必要的复制,并且根本不需要调整片段着色器。



 类似资料:
  • 我正在与Laravel 5.6与MySql数据库在我的Web应用程序。 我有下面的函数方法来添加顺序, 在我的系统中,我有以下车辆的表名, 现在我需要更新上面的表adtype值从0到1,当点击提交按钮关于上面的addorder函数。那么如何编写代码来更新上面函数中的代码呢???? 我的网址如下...... 路线是,

  • 我有一个firestore文档要更新。这是我的密码- 我正在对“merge:true”对象使用“set”方法。因为如果不存在,我想创建一个新文档,如果存在,我想更新数据。 我试图更新的文档正在被我发送的新属性重写,而不是将数据附加到现有文档中。我读到,使用{merge:true}将传入数据与当前数据合并,但这不起作用。我的整个文档正在被新数据替换。 这是我第一次创建文档时的firestore集合-

  • 这是一个众所周知的问题,当您在Windows上更新Java、JDK或JRE时,Eclipse很可能无法启动,因为它指向过时的JDK/JJRE文件夹。修复是相对简单的,它是在这里或这里的几个线程上讨论和解决的。 但我发现这些解决方案缺乏灵活性,令人不满意。此解决方案建议在转换为: 这意味着你必须在每次更新后,一次又一次地进行。如果您经常更新JDK,并且每个人都应该有最新的安全补丁,这会使它非常烦人。

  • 问题内容: 我的桌子上有很多记录(可能超过500 000或1 000 000)。我在此表中添加了一个新列,我需要使用该表中另一列的相应行值为该列中的每一行填充一个值。 我尝试使用单独的事务来选择每100条记录的下一个块并为其更新值,但是例如,要花费数小时来更新Oracle10中的所有记录。 在不使用某些方言特定功能的情况下,在SQL中执行此操作的最有效方法是什么,因此它可在任何地方(Oracle,

  • 问题内容: 我正在制作一个运行一些cmd命令(USMT和文件传输)的程序 它工作正常,但是只有在完成操作后,我才从文本框中的cmd获取最后一行。我希望它打印cmd实时输出的内容。 问题答案: 问题的根本原因是您阻止了事件调度线程,这将阻止在执行命令后更新UI。 Swing是一个单线程框架,这意味着您不应在EDT上下文中执行阻塞或长时间运行的代码。Swing也不是线程安全的,这意味着永远不要在EDT

  • 我的第一个问题,所以请指出我的错误。老实说,我找不到任何类似的问题。 所以我试图写一些非常基本的东西,我真的不明白为什么我不能从我的主类的Util类调用一个方法。 Util类 主课呢 我如何调用我的和方法?? 我已经找了几天了,我真的不知道怎么找。 我用的是2个长方形,也就是2个长方形。它们非常相似,所以我只放一个。 代码看起来有点混乱,但那是因为我一直在尝试一切:)欢迎任何建议。顺便说一句,我使