使用JavaCV来接收多播流,我想要在GLSurfaceView中呈现视频帧。使用FFmpegFrameGrabber类获取抓取的帧;我已成功地将捕获的帧输出到sdcard和非GL表面以进行可视化调试。我已经到处寻找解决方案或线索,但没有结果;这里是需要帮助的代码部分:
```java // 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(); } } ```
如果上述任何事情有更优化的方式,请让我知道。
另外,如果在用于创建Surface的SufaceTexture上渲染一个“解决方法”是否可能?
```java SurfaceTexture surfaceTexture = new SurfaceTexture(textureId); surfaceTexture.setOnFrameAvailableListener(this); surface = new Surface(surfaceTexture); ```
注意:我目前被迫坚持使用Android 4.2.2。
```java // 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(); } } ```
如果上述任何事情有更优化的方式,请让我知道。
另外,如果在用于创建Surface的SufaceTexture上渲染一个“解决方法”是否可能?
```java SurfaceTexture surfaceTexture = new SurfaceTexture(textureId); surfaceTexture.setOnFrameAvailableListener(this); surface = new Surface(surfaceTexture); ```
注意:我目前被迫坚持使用Android 4.2.2。