【发布时间】:2011-12-23 20:56:12
【问题描述】:
我正在使用带有 Eclipse 的 Android 2.2。
我想制作一个捕获视频的应用程序,并且对于每一帧,将其作为位图发送到处理它的方法并返回一个新位图并显示处理后的位图。
我对 Android 不是很熟悉,所以请谁能给我发一份我需要查看的资源来做这样的事情?
【问题讨论】:
我正在使用带有 Eclipse 的 Android 2.2。
我想制作一个捕获视频的应用程序,并且对于每一帧,将其作为位图发送到处理它的方法并返回一个新位图并显示处理后的位图。
我对 Android 不是很熟悉,所以请谁能给我发一份我需要查看的资源来做这样的事情?
【问题讨论】:
使用 Android SDK 完成以下步骤非常简单:
Camera.PreviewCallback 将返回 byte[] 的数据,以多种可能的图像格式表示帧。Bitmap 对象,以便更轻松地处理像素。在 2.2 中,您可以选择使用 NDK 和 jnigraphics 在本机代码中处理位图的像素,这比 Java 层要快得多。Bitmap 的内容并显示它。对于快速移动的数据,您可能希望在SurfaceView 上显示它;使用该视图包含的SurfaceHolder 中可用的lockCanvas() 和unlockCanvasAndPost() 方法。如果这就是您想做的全部,您可以轻松完成。但是,这与捕获视频不同。 Android 目前不提供挂钩让您将帧实时流式传输到编码的视频容器(MPEG4、3GP 等)中。它的视频捕捉功能被紧紧地包裹在MediaRecorder 中,它控制着从帧捕捉到编写编码视频的整个过程。您将需要一个第三部分库,例如 FFMPEG(已在 Android 应用程序中多次使用 NDK 层构建和运行)来协助修改帧的编码过程。
我知道您的目标是 2.2,但 Android 4.0 确实在这方面提供了一些帮助,因为他们发布了一个新版本的 NDK,它允许人们在从流中读取图像数据然后将其交给表示层。但是,我没有花足够的时间来了解它是否适合您的情况。
【讨论】:
如果你想做更复杂的实时视频处理,我强烈推荐OpenCV for Android。
OpenCV 是一个计算机视觉库,可让您实时处理视频,它具有执行简单任务(如检测边缘)或更复杂任务(如检测人脸和匹配特征)的库。
您可以在一天内让 OpenCV 在您的 Android 手机中运行,尤其是因为它包含大量文档和示例。
【讨论】:
您可以使用Camera.setPreviewCallback 和Camera.PreviewCallback#onPreviewFrame 来监听来自相机的预览帧。
2d Barcode 扫描仪的代码可能是一个有用的起点: ZXing
【讨论】: