小编Jam*_*hao的帖子

渲染脚本渲染比Android上的OpenGL渲染要慢得多

背景:

我想根据Android相机应用程序的代码添加实时过滤器.但Android相机应用程序的架构基于OpenGL ES 1.x. 我需要使用着色器来自定义我们的过滤器实现.但是,将相机应用程序更新为OpenGL ES 2.0非常困难.然后我必须找到一些其他方法来实现实时过滤器而不是OpenGL.经过一些研究,我决定使用渲染脚本.

问题:

我已经通过渲染脚本编写了一个简单过滤器的演示.它表明fps远低于OpenGL实现它.大约5 fps vs 15 fps.

问题:

  1. Android官方异地说:RenderScript运行时将并行处理设备上可用的所有处理器(如多核CPU,GPU或DSP)的工作,使您可以专注于表达算法而不是调度工作或负载平衡.那为什么渲染脚本实现较慢?

  2. 如果渲染脚本不能满足我的要求,有没有更好的方法?

代码详情:

嗨,我和提问者在同一个团队中.我们想要编写一个基于渲染脚本的实时滤镜相机.在我们的测试演示项目中,我们使用了一个简单的过滤器:添加了覆盖过滤器ScriptC脚本的YuvToRGB IntrinsicScript.在OpenGL版本中,我们将相机数据设置为纹理,并使用着色器执行image-filter-procss.像这样:

    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureYHandle);
    GLES20.glUniform1i(shader.uniforms.get("uTextureY"), 0);
    GLES20.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, mTextureWidth,
            mTextureHeight, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE,
            mPixelsYBuffer.position(0));
Run Code Online (Sandbox Code Playgroud)

在RenderScript版本中,我们将相机数据设置为Allocation,并使用script-kernals执行image-filter-procss.像这样:

    // The belowing code is from onPreviewFrame(byte[] data, Camera camera) which gives the camera frame data 
    byte[] imageData = datas[0];
    long timeBegin = System.currentTimeMillis();
    mYUVInAllocation.copyFrom(imageData);

    mYuv.setInput(mYUVInAllocation);
    mYuv.forEach(mRGBAAllocationA);
    // To make sure the process of YUVtoRGBA has finished!
    mRGBAAllocationA.copyTo(mOutBitmap);    
    Log.e(TAG, "RS time: YUV to RGBA : " …
Run Code Online (Sandbox Code Playgroud)

android opengl-es renderscript

7
推荐指数
1
解决办法
4466
查看次数

如何使用具有多个输入分配的 RenderScript?

最近,我发现渲染脚本是 Android 上图像处理的更好选择。表演很精彩。但关于它的文献并不多。我想知道是否可以通过渲染脚本将多张照片合并为结果照片。

http://developer.android.com/guide/topics/renderscript/compute.html说:

内核可能有输入Allocation、输出Allocation或两者都有。一个内核不能有超过一个输入或一个输出Allocation。如果需要多个输入或输出,这些对象应绑定到脚本全局变量,并通过或rs_allocation从内核或可调用函数访问。rsGetElementAt_type()rsSetElementAt_type()

这个问题有代码示例吗?

android renderscript

5
推荐指数
2
解决办法
1896
查看次数

无法播放Android中MediaCodec编码的H.264 avc视频

背景:

我一直在实施Vine这样的录像机,已有两天了。首先,我尝试了MediaRecorder。但是我需要的视频可能由小视频片段组成。此类不能用于录制短时视频剪辑。然后我找到了MediaCodec,FFmpeg和JavaCV。FFmpeg和JavaCV可以解决此问题。但是我必须使用许多库文件来编译我的项目。它将生成一个非常大的APK文件。所以我更喜欢通过MediaCodec实现它,尽管此类只能在Android 4.1之后使用。90%的用户将感到满意。

结果:

我终于得到了编码文件,但是无法播放。我通过FFprobe检查了信息,结果像:

输入0,h264,来自'test.mp4':持续时间:不适用,比特率:不适用流#0:0:视频:h264(基线),yuv420p,640x480,25 fps,25 tbr,1200k tbn, 50吨

我对H.264编码的机制了解不多。

码:

从此链接修改

public class AvcEncoder {

private static String TAG = AvcEncoder.class.getSimpleName();

private MediaCodec mediaCodec;
private BufferedOutputStream outputStream;
private int mWidth, mHeight;
private byte[] mDestData;

public AvcEncoder(int w, int h) {

    mWidth = w;
    mHeight = h;
    Log.d(TAG, "Thread Id: " + Thread.currentThread().getId());

    File f = new File("/sdcard/videos/test.mp4");

    try {
        outputStream = new BufferedOutputStream(new FileOutputStream(f));
        Log.i("AvcEncoder", "outputStream initialized");
    } catch (Exception e) {
        e.printStackTrace();
    }

    try { …
Run Code Online (Sandbox Code Playgroud)

video android encoder h.264 mediacodec

3
推荐指数
1
解决办法
6229
查看次数

如何在 Android 上隐藏 GLSL 实现细节

在 Android 上使用 GLSL 实现图像处理算法很简单。但算法的细节很容易在反编译的Java文件中作为字符串或资源文件中找到。我想知道是否存在一种隐藏 GLSL 细节的方法,例如使用编译的 GLSL 源或其他一些技术。

顺便说一句,我更喜欢使用 GLSurfaceView。

谢谢。

android opengl-es glsl

2
推荐指数
1
解决办法
1334
查看次数

标签 统计

android ×4

opengl-es ×2

renderscript ×2

encoder ×1

glsl ×1

h.264 ×1

mediacodec ×1

video ×1