7

环境:

Nexus 7 果冻豆 4.1.2

问题:

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

我希望有类似 onNewFrameListener 的东西

videoView.onNewFrame(Frame frame)

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

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

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

问题:

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

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

即使我需要重新编译 AOSP。

4

2 回答 2

3

您可以扩展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那里启动一个线程。

于 2012-12-02T08:15:15.447 回答
1

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

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

我认为它可能对你有用。

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

告诉你这是否是你正在寻找的东西。

祝你好运。

于 2012-11-30T12:10:21.133 回答