JavaCV - 在GL Surface上渲染

4
使用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。

你想做什么?你是想展示需要与音频部分同步的视频吗? - Edison
这里不需要音频,也没有与任何东西同步的要求。所有内容都在GL中,因此可以在同一屏幕上叠加或显示小部件等内容。 - Paul Gregoire
1个回答

1

使用ffmpeg处理各种视频格式:

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

至于将FFmpeg结果呈现到GLSurfaceView中,您应该查看此处:

(我曾使用过JJmpeg和JavaCV)

https://code.google.com/p/jjmpeg/source/browse/#svn%2Fbranches%2Fffmpeg-0.10-android%2Fjjmpeg%2Fsrc%2Fau%2Fnotzed%2Fjjmpeg%2Fmediaplayer

大部分的宝石都在这里:(GLESVideoRenderer.onDrawFrame方法)https://code.google.com/p/jjmpeg/source/browse/branches/ffmpeg-0.10-android/jjmpeg/src/au/notzed/jjmpeg/mediaplayer/GLESVideoRenderer.java 基本思路是将帧加载到2D纹理数组中,然后绘制它。
您可以将FFmpegFrameGrabber修改为GLSurfaceView的渲染器,不同设备的帧率会有所变化。
如果您知道视频格式:
既然您已经在Android 4.2.2上了,您真正应该做的是使用SDK中的MediaCodec,并直接将帧推送到表面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接