使用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。
答案 0 :(得分:1)
ffmpeg使用狂野视频格式:
对于您的第一种方法,您可以通过共享位图和其他资源加快速度,这将消除任何内存分配并加快速度。
至于将FFmpeg结果渲染到GLSurfaceView,你应该看一下:
(我已经使用过JJmpeg和JavaCV)
大多数宝石都在这里:(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并将帧直接推送到表面上。