我有一个GLSurfaceView设置和渲染预期使用a GLSurfaceView.Renderer.我的应用程序使用Android支持包中的片段.当我导航到一个新的片段surfaceDestroyed被调用但是当我通过backstack回到片段时GLSurfaceView将不会呈现,调用requestRender不会导致onDraw调用.
我知道我需要调用onResume和onPause表面视图,我从托管片段做这个,但它似乎没有解决问题.关于htis方法的所有例子都参考了活动,这可能是问题吗?如果是这样,你如何使用GLSurfaceView片段内部.
非常感谢任何见解,我很高兴发布代码,但它似乎更像是一个普遍的问题,
谢谢
我需要能够GLSurfaceView在特定时刻捕捉到某个时刻的图像.我有以下代码:
relative.setDrawingCacheEnabled(true);
screenshot = Bitmap.createBitmap(relative.getDrawingCache());
relative.setDrawingCacheEnabled(false);
Log.v(TAG, "Screenshot height: " + screenshot.getHeight());
image.setImageBitmap(screenshot);
Run Code Online (Sandbox Code Playgroud)
该GLSurfaceView包含内的RelativeLayout,但我也尝试它直接使用GLSurfaceView,试图捕捉图像.有了这个,我认为屏幕捕获透明图像,即没有任何东西.任何帮助将不胜感激.
我对EGL感到困惑.
我的GLSurfaceView创建了一个EGLContext.现在我创建一个共享上下文.现在我需要使用EGLExtension.
我必须使用的方法称为(> = API18):
EGLExt.eglPresentationTimeANDROID(android.opengl.EGLDisplay display, android.opengl.EGLSurface surface, long time);
Run Code Online (Sandbox Code Playgroud)
问题是,GLSurfaceView只创建了javax.microedition.khronos.egl.EGLContext.
这告诉我,不要使用GLSurfaceView.所以我尝试了稍微类似的TextureView,区别在于你必须处理自己的EGL内容.哪个对此有益.
但是:TextureView速度较慢,至少它看起来像那样,所以我用Method Profiler记录了一些图表:
这里的TextureView有自己的EGL处理:
顶部的Thread是一个唤醒Thread中间的时钟,它呈现在TextureView上.之后将调用主线程,用于重绘TextureView.
......这里的GLSurfaceView有自己的EGL处理这次时钟在中间,它调用顶部的线程将我的图像渲染成帧缓冲区,我直接将其提供给SurfaceView(RENDERMODE_WHEN_DIRTY)并调用requestRender请求视图呈现.

正如您所看到的那样,通过GLSurfaceView,它看起来比使用TextureView更清晰.
在这两个例子中,我在屏幕上没有任何其他东西,并且它们使用相同的着色器呈现完全相同的网格物体.
我的问题:有没有办法将GLSurfaceView与EGL14上下文一起使用?
我做错什么了吗?
我正在为Android编写信息可视化API,并试图将两个自定义单元GLSurfaceView放入布局中遇到问题.此时的Custom GLSurfaceView只是一个扩展,GLSurfaceView以消除自定义方法可能导致的故障.
当我在布局中添加了两个组件并启动它运行的应用程序时.但没有任何东西被绘制,似乎它进入了一个无限循环.因为Renderers中的调试消息被打印到LogCat中.但是,如果我只使用其中一个自定义GLSurfaceView组件,它的工作完全正常.
我读到GLSurfaceView在多个活动中使用时出现问题,我想在同时使用其中两个组件时也适用.我已经尝试过这里发布的解决方法,但似乎无法让它工作.
我将不胜感激任何帮助.我选择使用openGL以获得更好的性能,但如果我不能同时使用多个组件,我想我将不得不使用Canvas.
清单如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:text="@string/hello" android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<com.syntronic.vtadlib.VisualizationView android:id="@+id/glview"
android:layout_width="fill_parent" android:layout_height="300px" />
<TextView android:text="@string/hello" android:id="@+id/TextView02"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.syntronic.vtadlib.VisualizationView android:id="@+id/glview2"
android:layout_width="fill_parent" android:layout_height="fill_parent" />
</LinearLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
从Activity中,代码如下:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mSurfaceView = (VisualizationView) findViewById(R.id.glview);
mSurfaceView2 = (VisualizationView) findViewById(R.id.glview2);
//Enables debug flags for Errors
//mSurfaceView.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR);
//mSurfaceView2.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR);
mSurfaceView.setRenderer(new …Run Code Online (Sandbox Code Playgroud) 我是Open Gl世界的新手,我已经google了很多,但我无法找到一种方法来实现对正在播放的视频的效果.经过一番研究,我终于找到了一个类可以用来在GLSurfaceView播放视频.我从Google文档中了解到,我们可以对视频应用效果.
通过这篇文章,我能够成功地对位图应用效果.现在我想为我的视频做到这一点,所以任何帮助或指针都表示赞赏.
这是我用于渲染正在播放的视频的VideoSurfaceView
package me.crossle.demo.surfacetexture;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.Matrix;
import android.util.Log;
import android.view.Surface;
@SuppressLint("ViewConstructor")
class VideoSurfaceView extends GLSurfaceView {
VideoRender mRenderer;
private MediaPlayer mMediaPlayer = null;
public VideoSurfaceView(Context context, MediaPlayer mp) {
super(context);
setEGLContextClientVersion(2);
mMediaPlayer = mp;
mRenderer = new VideoRender(context);
setRenderer(mRenderer);
}
@Override
public void onResume() { …Run Code Online (Sandbox Code Playgroud) 是否有Surface,SurfaceHolder,EGLSurface,SurfaceView,GLSurfaceView,SurfaceTexture和TextureView的详细说明?特别是:
android surfaceview glsurfaceview surfaceflinger textureview
因此,在我的应用程序中,我能够使用GPUImage库向来自Camera的视频显示效果(如模糊滤镜,高斯).
基本上,我(库)将来自摄像机的输入,获得真实的原始字节的数据,将其转换为从YUV格式RGBA格式,然后应用上的影响到该图像和显示器Surface的GLSurfaceView使用OpenGL.最后,对于用户来说,它看起来像是应用了效果的视频.
现在我想Surface使用MediaCodec API 将视频帧记录下来.
但是这个讨论说我们无法将预定义传递Surface给MediaCodec.
我在bigflake看到了一些他正在Surface使用的样品,MediaCodec.createInputSurface()但对我来说,Surface来自于GLSurfaceView.
那么,我如何录制Surface视频的帧?
我将并行录制音频,使用FFMPEG合并该视频和音频,并作为应用效果的视频呈现给用户.
我想利用android xml布局.我在框架布局中放置了一个glSurfaceView,以便与线性布局结合使用......
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<android.opengl.GLSurfaceView android:id="@+id/surfaceviewclass"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
<LinearLayout android:id="@+id/gamecontrolslayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="5"
android:background="@drawable/backdrop">
//some layout stuff
</LinearLayout>
<LinearLayout>
Run Code Online (Sandbox Code Playgroud)
然后我就像这样调用我的布局
setContentView(R.layout.main);
GLSurfaceView glSurfaceView = (GLSurfaceView)findViewById(R.id.surfaceviewclass);
Run Code Online (Sandbox Code Playgroud)
在onCreate();
我怎样才能调用我的glSurfaceView以便我可以使用这样的xml布局并引用我自己的GLSurfaceView类(下面是引用我自己的GLSurfaceView类的代码)...
glSurfaceView = new MyGLSurfaceView(this);
setContentView(glSurfaceView);
Run Code Online (Sandbox Code Playgroud)
无论如何将这两者结合起来?我想这样做因为我在我的glSurfaceView类中有很多东西,比如文件加载和触摸事件.而且我只想到实现这个新布局
我正在寻找帮助解决我使用Grafika的CameraCaptureActivity代码所面临的问题.我想构建一个可以记录相机并显示预览的应用程序,所以这个样本和代码看起来就像我想要的那样,到目前为止它很棒,这个问题appart.
我的问题是,当相机预览尺寸与GLSurfaceView我用于显示预览的确切尺寸不匹配时,它会显示拉伸预览.
以下是它的外观:
你可以看到它是水平拉伸的,因为音符表是一个完美的正方形.
用于在三星Galaxy S4这种精确为例,相机预览大小1280x720(从使用预览可用大小提取Camera2API),并且GLSurfaceView是1920x1080覆盖整个屏幕.
什么时候出现?
当SurfaceView与Camera输出相比进行放大时,即使我始终确保比率保持正确(1920x1080= 1.5*1280x720),也会出现此问题.
你用的是什么代码?
我使用Grafika的代码,包括:
有些日志?
这是SurfaceFlinger转储的样子:
Hardware Composer state (version 01030000):
mDebugForceFakeVSync=0
Display[0] configurations (* current):
* 0: 1080x1920, xdpi=442.450989, ydpi=439.351013, secure=1 refresh=16666667
numHwLayers=3, flags=00000000
type | handle | hint | flag | tr | blnd | format | source crop(l,t,r,b) | frame | dirtyRect | name
------------+----------+----------+----------+----+-------+----------+-----------------------------------+---------------------------+-------------------
HWC | b3b12ba0 …Run Code Online (Sandbox Code Playgroud) 对不起我的英语不好.
我的工作基于https://github.com/harism/android_page_curl/
经过几个小时的研究,我找到了一些解决方案,但不是我在申请中遇到的所有问题.我在使用GLSurfaceView时遇到了一些麻烦.我有一个背景,有一个relativeLayout,一个GLSurfaceView和一个叠加在上面.
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/background"
android:layout_width="match_parent"
android:background="@layout/backgroundrepeat"
android:layout_height="match_parent">
<com.m2y.foxprez.view.CurlView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/openglview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/overlay"
android:layout_width="match_parent"
android:layout_height="match_parent">
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
当我开始我的观点时:
setEGLConfigChooser(8,8,8,8,16,0);
setRenderer(renderer);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
setZOrderMediaOverlay(true);
Run Code Online (Sandbox Code Playgroud)
在我的渲染器中:
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0f, 0f, 0f, 0f);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
gl.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST);
gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST);
gl.glEnable(GL10.GL_LINE_SMOOTH);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glDisable(GL10.GL_CULL_FACE);
}
public synchronized void onDrawFrame(GL10 gl) {
gl.glClearColor(0f,0f,0f,0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glLoadIdentity();
}
Run Code Online (Sandbox Code Playgroud)
经过多次研究,我目前被阻止了这个结果:
使用setZOrderOnTop,我有背景,但叠加层在视图下.
使用setZOrderMediaOverlay,我有叠加层,但背景为黑色.
有人可以帮帮我吗?
android ×10
glsurfaceview ×10
opengl-es ×7
java ×2
textureview ×2
ffmpeg ×1
grafika ×1
mediacodec ×1
surfaceview ×1
video ×1