0

我计划实现在一个屏幕上同时播放多个视频的功能,并且可以在播放视频时滚动视频视图。

我要将视频视图添加到充当其父视图的 ListView 中。我们不应该使用 SurfaceView 来渲染视频流,因为 SurfaceView 不能被 android 视图层次结构重绘。滚动 SurfaceView 是个坏主意。

幸运的是,TextureView 是从 API 级别 14 开始添加的,它是 SurfaceView 的替代品。所以我可以用它来实现我的计划。

但是TextureView只有API级别14以上才可用。实际上,我被要求在不低于API级别11的平台上实现这个功能。

我开始关注从 API 级别 11 开始添加到 android 的 SurfaceTexture,我们可以使用 SurfaceTexture 将相机图像流或视频解码流放到 OpenGL 纹理上,我也知道 android 视图层次结构是由 opengl 绘制的,而不是从 API 级别 11 开始的skia。

所以我想知道我是否可以使用 SurfaceTexture 将视频流渲染到普通的 android 视图上。

换句话说,我们是否可以为 api 级别 11-13 实现一个自定义的小部件来替换从 api 级别 14 开始添加的 TextureView 的位置?

我查看了android.view.TextureView的源码,不是很复杂,依赖类如下:

package android.view;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.SurfaceTexture;
import android.os.Looper;
import android.util.AttributeSet;
import android.util.Log;

并且有 4 个原生 api:

private native void nCreateNativeWindow(SurfaceTexture surface);
private native void nDestroyNativeWindow();

private static native boolean nLockCanvas(int nativeWindow, Canvas canvas, Rect dirty);
private static native void nUnlockCanvasAndPost(int nativeWindow, Canvas canvas);

是否可以将TextureView类移植到android api level 11-13?

谁能给我一些建议?

4

2 回答 2

1

我不能给你一个明确的答案,但我怀疑这是你可以直接放入你的应用程序的东西。对私有 API 的反射访问可能是可能的。

我看不出这是多么值得。如果您查看版本仪表板,您会发现 Gingerbread 和更早版本约占活动设备的 5.9%(截至 2015 年 7 月 7 日),因此即使您使用 API 10,您的市场份额也只会增加百分之几。API 11 中引入了硬件加速的 View 功能,因此我预计让 TextureView 在 API 10 中工作将是一个更大的挑战。API 11 甚至没有在仪表板中被调用——AFAIK 获得 Honeycomb 的少数设备都有资格升级到 ICS。

(您希望 API 11 与 API 14 支持哪些特定设备?没有那么多未升级的摩托罗拉 Xooms。您是否有 API 11 设备可供测试?)

使事情变得更加复杂的是缺少 API 11 源代码。Honeycomb 的消息来源从未公开。因此,您将在黑暗中进行大量摸索以使其正常工作。

我认为你最好的选择是拒绝提出请求的人。

于 2015-07-07T16:26:32.693 回答
0

你应该试试surfaceView,它可以解决你的问题。

如果您无法使用源代码处理该问题,请编辑您的问题。

于 2015-07-03T10:36:40.510 回答