编辑android VideoView帧

时间:2012-11-21 16:54:39

标签: android android-videoview android-source android-4.2-jelly-bean motion-detection

环境:

Nexus 7 Jelly Bean 4.1.2

问题:

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

我希望有像onNewFrameListener

这样的东西
videoView.onNewFrame(Frame frame)

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

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

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

问题:

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

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

即使我需要重新编译AOSP也是如此。

2 个答案:

答案 0 :(得分: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中进行繁重的计算,在那里开始一个线程。

答案 1 :(得分:1)

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

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

我觉得它对你有用。

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

告诉您这是否是您要搜索的内容。

祝你好运。