编辑Android VideoView帧

7

环境:

Nexus 7 Jelly Bean 4.1.2

问题:

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

我希望有类似于onNewFrameListener的东西。

videoView.onNewFrame(Frame frame)

我曾尝试通过VideoView获取RTSP流的原始帧,但在Android SDK中找不到相关支持。我发现VideoView封装了Android的MediaPlayer类。因此,我深入研究了media_jni库,试图找到访问原始帧的方法,但无法找到表示帧的字节缓冲区或其他内容。问题是:有人知道在哪里或如何找到该缓冲区并访问它吗?或者实现在VideoView上进行运动检测的其他方法?即使需要重新编译AOSP,也请给出建议。

你的应用程序只针对 Android 4.1 及以上版本吗? - yorkw
是的,但如果我需要早期版本,我也可以处理。 - Danpe
2个回答

3
你可以扩展VideoView并覆盖其draw(Canvas canvas)方法。
  • Set your bitmap to the canvas received through draw.
  • Call super.draw() which will get the frame drawn onto your bitmap.
  • Access the frame pixels from the bitmap.

    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中找不到任何相关信息。 - Danpe
在Bitmap类中有public void copyPixelsToBuffer (Buffer dst)方法。具体文档请参考:http://developer.android.com/reference/android/graphics/Bitmap.html#copyPixelsToBuffer(java.nio.Buffer) - Ron
“nothing”是什么意思? - Ron
我正在调试模式下,在 public void draw(Canvas canvas) 方法内部设置了断点,并在前面加上了 @Override,但是调试器没有进入该方法。 - Danpe
不起作用... 对于Video view,设置位图是不支持的操作...因为它不是简单的画布,而是硬件画布!java.lang.UnsupportedOperationException at android.view.HardwareCanvas.setBitmap(HardwareCanvas.java:39) at com.zemingo.MyVideoView.dispatchDraw(MyVideoView.java:38) - Ivelius
显示剩余5条评论

1
在您的情况下,如果您正在处理实时动态而不是录制视频,则应使用相机预览而不是VideoView。您可以使用Camera Preview Callback来捕获相机捕获的每一帧。此回调实现了:
onPreviewFrame(byte[] data, Camera camera)
Called as preview frames are displayed.

我认为这可能对您有用。

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

请告诉我那是否是您正在寻找的内容。

祝您好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接