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也是如此。
答案 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
告诉您这是否是您要搜索的内容。
祝你好运。