背景:
我想根据Android相机应用程序的代码添加实时过滤器.但Android相机应用程序的架构基于OpenGL ES 1.x. 我需要使用着色器来自定义我们的过滤器实现.但是,将相机应用程序更新为OpenGL ES 2.0非常困难.然后我必须找到一些其他方法来实现实时过滤器而不是OpenGL.经过一些研究,我决定使用渲染脚本.
问题:
我已经通过渲染脚本编写了一个简单过滤器的演示.它表明fps远低于OpenGL实现它.大约5 fps vs 15 fps.
问题:
Android官方异地说:RenderScript运行时将并行处理设备上可用的所有处理器(如多核CPU,GPU或DSP)的工作,使您可以专注于表达算法而不是调度工作或负载平衡.那为什么渲染脚本实现较慢?
如果渲染脚本不能满足我的要求,有没有更好的方法?
代码详情:
嗨,我和提问者在同一个团队中.我们想要编写一个基于渲染脚本的实时滤镜相机.在我们的测试演示项目中,我们使用了一个简单的过滤器:添加了覆盖过滤器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 上图像处理的更好选择。表演很精彩。但关于它的文献并不多。我想知道是否可以通过渲染脚本将多张照片合并为结果照片。
http://developer.android.com/guide/topics/renderscript/compute.html说:
内核可能有输入
Allocation、输出Allocation或两者都有。一个内核不能有超过一个输入或一个输出Allocation。如果需要多个输入或输出,这些对象应绑定到脚本全局变量,并通过或rs_allocation从内核或可调用函数访问。rsGetElementAt_type()rsSetElementAt_type()
这个问题有代码示例吗?
背景:
我一直在实施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) 在 Android 上使用 GLSL 实现图像处理算法很简单。但算法的细节很容易在反编译的Java文件中作为字符串或资源文件中找到。我想知道是否存在一种隐藏 GLSL 细节的方法,例如使用编译的 GLSL 源或其他一些技术。
顺便说一句,我更喜欢使用 GLSurfaceView。
谢谢。