Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android JavaCV-渲染到GL曲面_Android_Opencv_Javacv - Fatal编程技术网

Android JavaCV-渲染到GL曲面

Android JavaCV-渲染到GL曲面,android,opencv,javacv,Android,Opencv,Javacv,使用JavaCV使用多播流,我想在GLSurfaceView中渲染视频帧。使用FFmpegFrameGrabber类抓取帧;我已经成功地将捕获的帧输出到SD卡和非GL曲面,以便进行可视化调试。我到处寻找解决办法或线索,但毫无结果;以下是需要帮助的代码部分: //拿到镜框 opencv_core.IplImage img=capture.grab(); 如果(img!=null){ opencv_core.CvMat rgbaImg=opencv_core.CvMat.create(高度、宽度、

使用JavaCV使用多播流,我想在GLSurfaceView中渲染视频帧。使用FFmpegFrameGrabber类抓取帧;我已经成功地将捕获的帧输出到SD卡和非GL曲面,以便进行可视化调试。我到处寻找解决办法或线索,但毫无结果;以下是需要帮助的代码部分:

//拿到镜框
opencv_core.IplImage img=capture.grab();
如果(img!=null){
opencv_core.CvMat rgbaImg=opencv_core.CvMat.create(高度、宽度、CV_8U、4);
位图Bitmap=Bitmap.createBitmap(宽度、高度、Bitmap.Config.ARGB_8888);
//转换颜色空间
CVT颜色(img、rgbaImg、CV_BGR2RGBA);
copyPixelsFromBuffer(rgbaImg.getByteBuffer());
Rect Rect=新的Rect(x,y,宽度,高度);
Canvas c=surface.lockCanvas(rect);
c、 drawBitmap(位图,0,0,null);
表面。解锁画布和立柱(c);
if(位图!=null){
bitmap.recycle();
}
如果(rgbaImg!=null){
rgbaImg.release();
}
}
此外,如果有一个更理想的方式做上述任何事情,让我知道

编辑因为在这个问题的第一部分没有太多的动作,那么在用于创建曲面的表面纹理上进行渲染的“变通方法”会成为可能吗?

SurfaceTexture SurfaceTexture=新的SurfaceTexture(textureId);
surfaceTexture.setOnFrameAvailableListener(此);
表面=新表面(表面纹理);


注意:我现在不得不坚持使用Android 4.2.2。

ffmpeg和野生视频格式:

对于第一种方法,您可以通过共享位图和其他资源来提高速度,这将消除任何内存分配并大大提高速度

至于将FFmpeg结果渲染到GLSURFACHEVIEW,您应该查看以下内容:

(我同时使用了JJmpeg和JavaCV)

大多数宝石都在这里:(GLESVideoRenderer.onDrawFrame方法)

基本思想是将帧加载到2D纹理数组中,然后绘制它

您可以将FFmpegFrameGrabber修改为GLSurfaceView的渲染器,不同设备的帧率会有所不同

如果您知道视频格式:


既然您已经在安卓4.2.2上了,那么您真正应该做的是使用SDK中的MediaCodec并将帧直接推到一个表面上

你想干什么?您正在尝试显示需要与音频部分同步的视频吗?此处不需要音频,也不需要与任何内容同步。所有内容都在GL中,以便小部件等可以覆盖或显示在同一屏幕上。 // get the frame opencv_core.IplImage img = capture.grab(); if (img != null) { opencv_core.CvMat rgbaImg = opencv_core.CvMat.create(height, width, CV_8U, 4); Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); // convert colorspace cvCvtColor(img, rgbaImg, CV_BGR2RGBA); bitmap.copyPixelsFromBuffer(rgbaImg.getByteBuffer()); Rect rect = new Rect(x, y, width, height); Canvas c = surface.lockCanvas(rect); c.drawBitmap(bitmap, 0, 0, null); surface.unlockCanvasAndPost(c); if (bitmap != null) { bitmap.recycle(); } if (rgbaImg != null) { rgbaImg.release(); } } SurfaceTexture surfaceTexture = new SurfaceTexture(textureId); surfaceTexture.setOnFrameAvailableListener(this); surface = new Surface(surfaceTexture);