使用http服务器在Android上显示连接到rasberry pi的网络摄像头的图像流
我和我的团队正在大学里从事机器人技术项目。我们有一个Rasberry Pi,我们在上面附加了一个网络摄像头,并使用OpenCV进行图像处理。Rasberry Pi进行一些处理,并与船上的Arduino进行通信,然后Arduino继续执行一些有用的操作,如向前移动机器人、转弯等 该项目还涉及制作一个Android应用程序,该应用程序将(除其他外)用于控制机器人,并显示安装在机器人上的摄像头的馈源(连接到Rasberry Pi)。我的问题涉及到解决在我的Android应用程序上显示网络摄像头图像的问题 为了进行通信,我使用了一个wsgipython框架balltypy()。相关代码(在Rasberry Pi上)为: 这个脚本可以单独运行,或者我可以将这个代码移到我的服务器代码中,但是将它移到服务器代码中会给我带来一些问题,我将用我的android代码解释这些问题 android上的数据流不需要非常平滑。但我是这样做的: 我创建一个runnable并使用一个处理程序每100毫秒调用一次runnable:使用http服务器在Android上显示连接到rasberry pi的网络摄像头的图像流,android,python,opencv,raspberry-pi,bottle,Android,Python,Opencv,Raspberry Pi,Bottle,我和我的团队正在大学里从事机器人技术项目。我们有一个Rasberry Pi,我们在上面附加了一个网络摄像头,并使用OpenCV进行图像处理。Rasberry Pi进行一些处理,并与船上的Arduino进行通信,然后Arduino继续执行一些有用的操作,如向前移动机器人、转弯等 该项目还涉及制作一个Android应用程序,该应用程序将(除其他外)用于控制机器人,并显示安装在机器人上的摄像头的馈源(连接到Rasberry Pi)。我的问题涉及到解决在我的Android应用程序上显示网络摄像头图像的问
runnable = object : Runnable {
override fun run() {
/* do what you need to do */
try {
val performBackgroundTask = DownloadImageTask(findViewById(R.id.imageView))
// PerformBackgroundTask this class is the class that extends AsynchTask
performBackgroundTask.execute("http://$id:8080/static/image.jpg")
} catch (e: Exception) {
// TODO Auto-generated catch block
}
/* and here comes the "trick" */
handler.postDelayed(this, 100)
}
}
我的异步任务的代码:
class DownloadImageTask(val bmImage: ImageView) : AsyncTask<String,Void,Bitmap>() {
val tag = "DownloadImageTask"
override fun doInBackground(vararg urls: String?): Bitmap? {
val urldisplay = urls[0]
var mIcon11: Bitmap? = null
try {
val `in` = java.net.URL(urldisplay).openStream()
if (`in` != null) {
mIcon11 = BitmapFactory.decodeStream(`in`)
}
} catch (e: Exception) {
Log.e(tag, e.message)
e.printStackTrace()
}
return mIcon11
}
override fun onPostExecute(result: Bitmap?) {
if (result != null)
bmImage.setImageBitmap(result)
}
}
服务器仍会持续发送图像一段时间,任何其他请求都会延迟
我需要一个解决方案或者一个完全不同的方法来完成这件事。请帮忙?(很抱歉提出这么长的问题)经过多次尝试和错误,我找到了最适合我的解决方案 首先,为了获得一致的Jpeg流,我创建了一个Mjpeg流,并使其可以在本地网络(HTTP服务器)上访问。Mjpeg(s)确保序列图像的平滑流动。这比将图像保存到本地存储,然后通过HTTP服务器发送要好得多 这里可以找到Mjpeg服务器的一个示例代码:,另一个是 上述任一示例中的python代码都可以在Rasberry Pi上运行。我更喜欢第二个,因为它允许对流的多个访问 现在对于Android,我使用。这使得Android上的mjpeg流非常容易。然而,我有一些问题。它不适用于所有类型的相机,有时会使我的应用程序崩溃。但我相信我能解决这个问题(换相机有帮助)。此外,我需要启动和停止一个按钮点击流。我还没能做到这一点。它开始,但仅在我退出该活动时停止。还有其他一些项目可以让Android更容易地使用mjpg流媒体,如果我找到更好的,我会更新答案。在那之前,这是一个很好的解决方案 编辑:在Android上显示mjpeg流的另一种更简单的方式: 当我使用WebView时,我会得到最好的结果。要启动流,请使用
webView.loadUrl("http://localhost:8080/cam.mjpeg")
为了更好地适应视频,在您的onCreate功能中:
// All code in Kotlin, for Java, use functions instead of preperty access syntax
webView.settings.loadWithOverviewMode = true;
webView.settings.useWideViewPort = true;
handler.removeCallbacks(runnable)
webView.loadUrl("http://localhost:8080/cam.mjpeg")
// All code in Kotlin, for Java, use functions instead of preperty access syntax
webView.settings.loadWithOverviewMode = true;
webView.settings.useWideViewPort = true;