JavaCV - 渲染到GL曲面

时间:2014-01-22 19:58:50

标签: android opencv javacv

使用JavaCV来使用多播流,我想在GLSurfaceView中呈现视频帧。使用FFmpegFrameGrabber类抓取帧;我已成功将捕获的帧输出到SD卡和非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();
   }
 }
如果有更好的方法可以做任何事情,请告诉我。

编辑由于在这个问题的第一部分没有太多动作,是否有可能在用于创建Surface的SufaceTexture上渲染“解决方法”?

  SurfaceTexture surfaceTexture = new SurfaceTexture(textureId);
  surfaceTexture.setOnFrameAvailableListener(this);
  surface = new Surface(surfaceTexture);

注意:我现在被迫坚持使用Android 4.2.2。

1 个答案:

答案 0 :(得分: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并将帧直接推送到表面上。