我这两天一直在努力... 以下答案:https://stackoverflow.com/a/2006454/444324 - 提到可以通过修改API演示中的MediaPlayerDemo_Video示例在GLSurfaceView中播放视频:
你要做的就是用一个替换SurfaceView MediaSlayerDemo_Video.java文件中的GLSurfaceView以及 在相应的布局文件(mediaplayer_2.xml)中。
您还需要创建一个自定义Renderer类(一个实现的类) GLSurfaceView.Renderer接口)并将其设置为您的 GLSurfaceView。
我尝试按照建议将SurfaceView替换为GLSurfaceView,using this但它在启动时崩溃:
07-11 14:54:22.086: E/AndroidRuntime(12373): FATAL EXCEPTION: main
07-11 14:54:22.086: E/AndroidRuntime(12373): java.lang.NullPointerException
07-11 14:54:22.086: E/AndroidRuntime(12373): at android.opengl.GLSurfaceView.surfaceCreated(GLSurfaceView.java:512)
07-11 14:54:22.086: E/AndroidRuntime(12373): at android.view.SurfaceView.updateWindow(SurfaceView.java:533)
07-11 14:54:22.086: E/AndroidRuntime(12373): at android.view.SurfaceView.access$000(SurfaceView.java:81)
07-11 14:54:22.086: E/AndroidRuntime(12373): at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:169)
07-11 14:54:22.086: E/AndroidRuntime(12373): at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:590)
07-11 14:54:22.086: E/AndroidRuntime(12373): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1617)
07-11 14:54:22.086: E/AndroidRuntime(12373): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
07-11 14:54:22.086: E/AndroidRuntime(12373): at android.os.Handler.dispatchMessage(Handler.java:99)
07-11 14:54:22.086: E/AndroidRuntime(12373): at android.os.Looper.loop(Looper.java:137)
07-11 14:54:22.086: E/AndroidRuntime(12373): at android.app.ActivityThread.main(ActivityThread.java:4575)
07-11 14:54:22.086: E/AndroidRuntime(12373): at java.lang.reflect.Method.invokeNative(Native Method)
07-11 14:54:22.086: E/AndroidRuntime(12373): at java.lang.reflect.Method.invoke(Method.java:511)
07-11 14:54:22.086: E/AndroidRuntime(12373): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
07-11 14:54:22.086: E/AndroidRuntime(12373): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-11 14:54:22.086: E/AndroidRuntime(12373): at dalvik.system.NativeStart.main(Native Method)
我知道我可以使用VideoView播放视频,或者只使用带有MediaPlayer的SurfaceView,但我必须使用GLSurfaceView,因为我需要在摄像机表面视图上播放此视频。
谢谢!
相关代码: 我的XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.commonsware.android.camera.MyGLSurfaceView
android:id="@+id/surface"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</LinearLayout>
我的班级:
public class MediaPlayerDemo_Video extends Activity implements
OnBufferingUpdateListener, OnCompletionListener,
OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback {
private MediaPlayer mMediaPlayer;
private MyGLSurfaceView mPreview;
private SurfaceHolder holder;
/**
*
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.mediaplayer_2);
mPreview = (MyGLSurfaceView) findViewById(R.id.surface);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
}
MyGLSurfaceView类:
class MyGLSurfaceView extends android.opengl.GLSurfaceView {
public MyGLSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
答案 0 :(得分:2)
好的,解决了这个......我有几个错误,但我在问题中提出的最后一个错误是通过将此代码添加到onCreate来解决的:
mPreview.setRenderer(new Renderer() {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
}
});
答案 1 :(得分:2)
使用带有GLSurfaceView的OpenGl ES 2.0
查看此处可用于播放视频的代码https://github.com/satish13131/Android_Programs/tree/master/graphics/opengl/video/surfaceview
它涉及视频的OpenGL渲染
答案 2 :(得分:0)
在一个地方你指的是android.opengl.GLSurfaceView
而另一个地方指的是com.commonsware.android.camera.GLSurfaceView
它们是来自不同包的不同的GLSurfaceView类
答案 3 :(得分:0)
为什么要实现与com.commonsware.android.camera.GLSurfaceView
同名的课程(GLSurfaceView
)?
如果您在布局XML中将视图声明为android.opengl.GLSurfaceView
,则无法将其转换为com.commonsware.android.camera.GLSurfaceView