编辑 android VideoView 帧

Posted

技术标签:

【中文标题】编辑 android VideoView 帧【英文标题】:Editing android VideoView frames 【发布时间】:2012-11-09 23:52:26 【问题描述】:

环境:

Nexus 7 果冻豆 4.1.2

问题:

我正在尝试使用 VideoView 制作与 RTSP 一起使用的运动检测应用程序。

我希望有类似 onNewFrameListener 的东西

videoView.onNewFrame(Frame frame)

我尝试通过 VideoView 访问 RTSP 流的原始帧,但在 android SDK 中找不到任何支持。

我发现VideoView封装了Android的MediaPlayer类。

所以我潜入media_jni 库试图找到一种访问原始帧的方法,但找不到字节缓冲区或任何代表帧的东西。

问题:

任何人都知道我在哪里或如何找到这个缓冲区并访问它?

或者任何其他在 VideoView 上实现运动检测的想法?

即使我需要重新编译 AOSP。

【问题讨论】:

您的应用是否仅针对 Android 4.1 及更高版本? 是的,但如果我需要更早的版本,我也可以管理。 【参考方案1】:

您可以扩展VideoView 并覆盖其draw(Canvas canvas) 方法。

将您的位图设置为通过draw 接收的画布。 调用super.draw() 将帧绘制到您的位图上。

从位图中访问帧像素。

class MotionDetectorVideoView extends VideoView 
public Bitmap mFrameBitmap;
...
    @Override
    public void draw(Canvas canvas) 
        // set your own member bitmap to canvas..
        canvas.setBitmap(mFrameBitmap);
        super.draw(canvas);
        // do whatever you want with mFrameBitmap. It now contains the frame.
        ...
        // Allocate `buffer` big enough to hold the whole frame.
        mFrameBitmap.copyPixelsToBuffer(buffer);
        ...
    

我不知道这是否可行。避免在draw 中进行繁重的计算,在那里启动一个线程。

【讨论】:

如何获得画布的原始像素?在他们的 API 中找不到任何关于它的内容。 位图类中有public void copyPixelsToBuffer (Buffer dst)。此处的文档:developer.android.com/reference/android/graphics/… 是的,但是如何从画布中获取位图? 您已经在mFrameBitmap. 中获得了位图引用。在构造函数中创建位图.. 参见上面的编辑.. 所以你说当我调用super.draw(canvas) 时,它会利用当前位图而不是用新的位图替换?而且我可以在draw 中调用NDK 计算?【参考方案2】:

在您的情况下,如果您使用的是实时动作而不是录制的视频,我会使用相机预览而不是 VideoView。您可以使用相机预览回调来捕捉相机捕获的每一帧。这个回调实现:

onPreviewFrame(byte[] data, Camera camera)
Called as preview frames are displayed.

我认为它可能对你有用。

http://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html

告诉你这是不是你要搜索的。

祝你好运。

【讨论】:

以上是关于编辑 android VideoView 帧的主要内容,如果未能解决你的问题,请参考以下文章

如何使用来自外部设备的 setVideoURI 流从 android videoview 获取帧?

无法让 Vitamio VideoView 播放普通 Android VideoView 会播放的视频文件

从 URL 滞后片段加载 VideoView

Android Studios - 在布局编辑器中调整 VideoView 大小

为啥我不能从 VideoView 播放我的视频?

Android 2.2:从 SD 卡播放视频时出现问题