80,350
社区成员
发帖
与我相关
我的任务
分享
public class LocalHolder implements SurfaceHolder{
SurfaceTexture m_st;
Surface m_surface;
LocalHolder(SurfaceTexture st){
m_st = st;
m_surface = new Suface(m_st);
}
@Override
public Surface getSurface() {
return m_surface;
}
....//其他接口还需要补全
}
这样,你建立一个SurfaceTexture初始化后传给用这个texture构造一个LocalHolder出来,
然后Mediaplayer.setDisplay就传入LocalHolder对象。[/quote]
卡卡西你真是大神,我最近想要实现一个后台录像,也是急得不行,烦死了,现在在考虑怎么调用摄像头然后直接从摄像头获取数据,不让它preview了。[/quote]
你这个不难的,不能用surfaceview(到后台后surface会摧毁),surfacetexture就可以了。
有不少监控软件都是这么做的,在前台能显示,到后台还能继续监控。[/quote]
谢谢大神!
public class LocalHolder implements SurfaceHolder{
SurfaceTexture m_st;
Surface m_surface;
LocalHolder(SurfaceTexture st){
m_st = st;
m_surface = new Suface(m_st);
}
@Override
public Surface getSurface() {
return m_surface;
}
....//其他接口还需要补全
}
这样,你建立一个SurfaceTexture初始化后传给用这个texture构造一个LocalHolder出来,
然后Mediaplayer.setDisplay就传入LocalHolder对象。[/quote]
卡卡西你真是大神,我最近想要实现一个后台录像,也是急得不行,烦死了,现在在考虑怎么调用摄像头然后直接从摄像头获取数据,不让它preview了。[/quote]
你这个不难的,不能用surfaceview(到后台后surface会摧毁),surfacetexture就可以了。
有不少监控软件都是这么做的,在前台能显示,到后台还能继续监控。
public class LocalHolder implements SurfaceHolder{
SurfaceTexture m_st;
Surface m_surface;
LocalHolder(SurfaceTexture st){
m_st = st;
m_surface = new Suface(m_st);
}
@Override
public Surface getSurface() {
return m_surface;
}
....//其他接口还需要补全
}
这样,你建立一个SurfaceTexture初始化后传给用这个texture构造一个LocalHolder出来,
然后Mediaplayer.setDisplay就传入LocalHolder对象。[/quote]
卡卡西你真是大神,我最近想要实现一个后台录像,也是急得不行,烦死了,现在在考虑怎么调用摄像头然后直接从摄像头获取数据,不让它preview了。写错了,应该是”surfaceTexture.java里面的成员mSurfaceTexture,他是int类型,实际是一个指向native层的GLConsumer对象的指针。“这些在android代码里面都有的,不要光看api,往下看看实现。
是不知道怎么用。播放视频的时候数据流是有更新的,它就会一直被调用的,如果要进行数据处理,应该就是在这进行。 视频正播放的时候无画面输出,只有声音。 如果我要取出SurfaceTexture中的数据应该怎么取呢? [quote=引用 54 楼 yu8fei 的回复:] [quote=引用 53 楼 YKDSea 的回复:] 不知道你是怎么理解的,onFrameAvailable是回调函数,有新数据来的时候,才会被调用,不是看调用的参数。
是不知道怎么用。播放视频的时候数据流是有更新的,它就会一直被调用的,如果要进行数据处理,应该就是在这进行。 视频正播放的时候无画面输出,只有声音。 如果我要取出SurfaceTexture中的数据应该怎么取呢? [quote=引用 53 楼 YKDSea 的回复:] 不知道你是怎么理解的,onFrameAvailable是回调函数,有新数据来的时候,才会被调用,不是看调用的参数。
mSurfaceTexture是在jni里面赋值的,java层的确看不到什么东西。从Surface入手,我觉得是不好做的,surface是处于一个生产者的角色,SurfaceTexture才是消费者,你现在是要使用player生产出来的buffer,从SurfaceTexture这边入手更合适。
[quote=引用 62 楼 YKDSea 的回复:] VideoSurfaceView这个是你自己写的吧? 我的意思是要对SurfaceTexture扩展一下,前面说的成员都是class SufaceTexture中的,你要拿的buffer就在class SurfaceTexture中。
VideoSurfaceView这个是你自己写的吧? 我的意思是要对SurfaceTexture扩展一下,前面说的成员都是class SufaceTexture中的,你要拿的buffer就在class SurfaceTexture中。
mTextureID是int类型的,mSurfaceTexture是SurfaceTexture类型的 写错了,应该是”surfaceTexture.java里面的成员mSurfaceTexture,他是int类型,实际是一个指向native层的GLConsumer对象的指针。“这些在android代码里面都有的,不要光看api,往下看看实现。
class VideoSurfaceView extends GLSurfaceView {
private VideoRender mRenderer;
private MediaPlayer mMediaPlayer = null;
public VideoSurfaceView(Context context, MediaPlayer mp) {
super(context);
setEGLContextClientVersion(2);
mMediaPlayer = mp;
mRenderer = new VideoRender(context);
setRenderer(mRenderer);
mRenderer.setMediaPlayer(mMediaPlayer);
}
@Override
public void onResume() {
queueEvent(new Runnable(){
public void run() {
mRenderer.setMediaPlayer(mMediaPlayer);
}});
super.onResume();
}
private static class VideoRender
implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener {
......
private final float[] mTriangleVerticesData = {
// X, Y, Z, U, V
-1.0f, -1.0f, 0, 0.f, 0.f,
1.0f, -1.0f, 0, 1.f, 0.f,
-1.0f, 1.0f, 0, 0.f, 1.f,
1.0f, 1.0f, 0, 1.f, 1.f,
};
private FloatBuffer mTriangleVertices;
......
private float[] mMVPMatrix = new float[16];
private float[] mSTMatrix = new float[16];
private int mProgram;
private int mTextureID;
private int muMVPMatrixHandle;
private int muSTMatrixHandle;
private int maPositionHandle;
private int maTextureHandle;
private SurfaceTexture mSurfaceTexture;
private boolean updateSurface = false;
private MediaPlayer mPlayer;
public VideoRender(Context context) {
mTriangleVertices = ByteBuffer.allocateDirect(
mTriangleVerticesData.length * FLOAT_SIZE_BYTES)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
mTriangleVertices.put(mTriangleVerticesData).position(0);
Matrix.setIdentityM(mSTMatrix, 0);
}
private void setMediaPlayer(MediaPlayer player) {
mPlayer = player;
}
@Override
public void onDrawFrame(GL10 glUnused) {
synchronized(this) {
if (updateSurface) {
mSurfaceTexture.updateTexImage();
mSurfaceTexture.getTransformMatrix(mSTMatrix);
updateSurface = false;
}
}
......
}
@Override
public void onSurfaceChanged(GL10 glUnused, int width, int height) {
}
@Override
public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
......
int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
mTextureID = textures[0];
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID);
......
/*
* Create the SurfaceTexture that will feed this textureID,
* and pass it to the MediaPlayer
*/
mSurfaceTexture = new SurfaceTexture(mTextureID);
mSurfaceTexture.setOnFrameAvailableListener(this);
Surface surface = new Surface(mSurfaceTexture);
mPlayer.setSurface(surface);
mPlayer.setScreenOnWhilePlaying(true);
surface.release();
try {
mPlayer.prepare();
} catch (IOException t) {
Log.e(TAG, "media player prepare failed" + t);
}
synchronized(this) {
updateSurface = false;
}
mPlayer.start();
Log.i(TAG, "media player start");
}
synchronized public void onFrameAvailable(SurfaceTexture surface) {
updateSurface = true;
}
private int loadShader(int shaderType, String source) {
......
return shader;
}
private int createProgram(String vertexSource, String fragmentSource) {
......
return program;
}
......
} // End of class VideoRender.
} // End of class VideoSurfaceView.
[quote=引用 47 楼 YKDSea 的回复:] [quote=引用 45 楼 yu8fei 的回复:] [quote=引用 44 楼 YKDSea 的回复:] [quote=引用 42 楼 yu8fei 的回复:] 错了错了,弄混乱了有点, 上面那个不是“读取camera图像流的例子”,是另外的一个 SurfaceTexture测试video用的, createProgram对应的俩个参数就是上面的两个字符串,求大神帮忙解释说明下,应该从哪里着手
public class LocalHolder implements SurfaceHolder{
SurfaceTexture m_st;
Surface m_surface;
LocalHolder(SurfaceTexture st){
m_st = st;
m_surface = new Suface(m_st);
}
@Override
public Surface getSurface() {
return m_surface;
}
....//其他接口还需要补全
}
这样,你建立一个SurfaceTexture初始化后传给用这个texture构造一个LocalHolder出来,
然后Mediaplayer.setDisplay就传入LocalHolder对象。[/quote]这个API我知道,问题是播放不出来东西[/quote]、
surfacetexture界面上肯定是看不到东西的,先setOnFrameAvailableListener()设置个listener看看有没有数据上来,要想看到,还要把texture再画出去。[quote=引用 45 楼 yu8fei 的回复:] [quote=引用 44 楼 YKDSea 的回复:] [quote=引用 42 楼 yu8fei 的回复:] 错了错了,弄混乱了有点, 上面那个不是“读取camera图像流的例子”,是另外的一个 SurfaceTexture测试video用的, createProgram对应的俩个参数就是上面的两个字符串,求大神帮忙解释说明下,应该从哪里着手
public class LocalHolder implements SurfaceHolder{
SurfaceTexture m_st;
Surface m_surface;
LocalHolder(SurfaceTexture st){
m_st = st;
m_surface = new Suface(m_st);
}
@Override
public Surface getSurface() {
return m_surface;
}
....//其他接口还需要补全
}
这样,你建立一个SurfaceTexture初始化后传给用这个texture构造一个LocalHolder出来,
然后Mediaplayer.setDisplay就传入LocalHolder对象。[/quote]这个API我知道,问题是播放不出来东西