在 Android 上获取 IP Cam 视频流 (MJPEG)
Posted
技术标签:
【中文标题】在 Android 上获取 IP Cam 视频流 (MJPEG)【英文标题】:Getting IP Cam video stream on Android (MJEPG) 【发布时间】:2011-05-28 07:16:54 【问题描述】:我目前正在做一个 3 人一组的 AndAR 项目。我是负责将视频流式传输到 android 手机的人。
我给自己买了一台 D-Link DCS-920 IP 摄像机,我发现它使用 MJPEG 编解码器进行实时视频流,而网络服务器使用 Jview 来查看实时流。据我所知,MJPG 不是 Android 操作系统支持的文件类型,所以我想出了一个主意,我没有使用 ImageView,而是使用 WebView 来流式传输视频。
我已经实现了一个非常简单的概念并且它有效!但问题是,刷新率很糟糕。
我让视频图像(例如:http://192.168.1.10/image.jpg
)在 WebView 上查看并实现一个计时器来控制刷新率(应该将其设置为 30fps,即每 33ms 刷新一次)但它只能达到 500ms 间隔,我注意到任何较低的间隔都不会更平滑,有时图像不会加载并且连接不稳定(例如:掉线)。这可能是我刷新的速度比它可以接收的快吗?
但是在网络服务器 Jview 上它没有问题!试图找到 jview 的源代码,但我没有希望。
不管怎样,这是我写的代码
package org.example.test;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.EditText;
public class Webview extends Activity
public WebView webView;
public Timer autoUpdate;
public String url;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webView = (WebView) findViewById(R.id.webview);
webView.getSettings();
final EditText urlText = (EditText) findViewById(R.id.urlText);
//Buttons//////////////////------------
final Button connectB = (Button)findViewById(R.id.connectButton);
connectB.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
//Actions goes here
url = urlText.getText().toString();
webView.loadUrl(url);
timerSetup();
);
final Button exitB = (Button)findViewById(R.id.exitButton);
exitB.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
//Actions goes here
finish();
);
//refresh timer//////////////-----------------
public void timerSetup()
autoUpdate = new Timer();
autoUpdate.schedule(new TimerTask()
@Override
public void run()
runOnUiThread(new Runnable()
@Override
public void run()
//Actions goes here
webView.loadUrl(url);
);
, 0, 500);//refresh rate time interval (ms)
无论如何我可以让视频流以至少 15fps 的速度输入/具有更快的刷新率吗? 有没有可以用来显示这些图像的 MJPEG 查看器/源代码之类的东西?
这是应用程序的屏幕截图 http://s945.photobucket.com/albums/ad295/kevinybh/?action=view¤t=video.jpg (积分不够发图片):(
我只需要将视频流设为 15-30fps 左右。任何建议/帮助将不胜感激:) 谢谢!
【问题讨论】:
通过网络加载图片的时间很可能会超过 33 毫秒。每次上一张完成加载后,您可以尝试重新加载图片吗? 我该怎么做?我的意思是检查它是否完成加载图片并在完成加载后立即重新加载 【参考方案1】:您可以使用 Raspberry PI 代替 Arduino,它应该有足够的 CPU 能力来控制车辆并同时转换视频流。当然,您需要将所有 Arduino 软件移植到 Raspberry...
【讨论】:
@FlashThunder 我还没有使用过 Raspberry,但据我所知,它运行某种 Linux,拥有强大的 GPU,而且有人说它甚至可以编码 H.264 30 fps 的 1080p 视频。我对 1080p 视频非常怀疑,但它可能可以编码 IPcam 的 VGA 640x480 视频流。 harrybuttle.wordpress.com/2013/08/05/… 如果需要更多的电力,还有谁构建了 Raspberry 的集群。只需谷歌“覆盆子视频编码”和/或“覆盆子集群”。 它只有700Mhz的处理器......我真的怀疑它是否可以实时编码...... Raspeberrypi 的强大功能实际上取决于您是否可以让其高度专有的 GPU 完成这项工作,或者您是否必须使用相对弱小的 CPU 来完成这项工作。如果您可以从 Broadcomm 获得 GPU 文档,或者您的需求得到了已经做过的人编写的可用代码的支持,那就太好了。否则,CPU 可能无法胜任任务。【参考方案2】:您可以使用 MjpegView 类直接显示 mjpeg 流。 https://code.google.com/p/android-camera-axis/source/browse/trunk/serealisation/src/de/mjpegsample/MjpegView/MjpegView.java?r=33
你必须在这个类上实现一些 AsyncTasks 才能正常工作。
祝你好运
【讨论】:
【参考方案3】:有一个有用的previous SO discussion 和这个great one with code。你会尝试让我们知道这是否适合你。
【讨论】:
【参考方案4】:在android上,如果我们通过CPU解码一个jpeg,它将花费40-100ms。如果我们想将 mjpeg 播放到 15-30fps,我们需要硬件 jpeg 解码器。
【讨论】:
【参考方案5】:MJPEG 是将动态视频传送到移动设备的一种非常低效的方式,因为每一帧都被压缩为它自己的独立图片。对于不需要视频的应用程序(上周有人询问是否有摄像头在等待排队),您每秒左右推送一个静态帧的解决方案听起来不错。
如果您需要动态视频,我建议您在网络服务器上将 MJPEG 转码为使用帧到帧压缩的受支持视频格式。这将导致要推送的数据少得多,无论是通过用户的 3g 连接还是从您的服务器到其所有客户端。您应该只需要运行一个转码引擎来支持所有客户端 - 您可以将相同的转码引擎用于 android 和 iphone 设备,但如果您的相机输出,您可能还希望为平板电脑和 pc 提供更高分辨率的输出足以证明它的合理性。
【讨论】:
网络服务器与相机本身一起提供,我可以选择的唯一支持的压缩是 MJPEG。如何将其转码为其他格式? 您可能需要其他网络服务器软件(在相机和客户端之间的服务器上运行)。你也许可以用 VLC 做一些实验性的事情,尽管这是一个包含很多技术的包,隐藏在相当不一致的配置界面后面。 这意味着我必须使用 VLC 流式传输我的 IP cam?实际上我的项目是一个 RC 车辆增强现实游戏。所以我有一个连接到车辆的无线 IP 摄像头和一个连接有 WiFly 屏蔽的 Arduino 板。我应该将视频从 IP 流式传输到我的 android 手机,并能够同时通过手机控制车辆。我的计划是取消路由器和笔记本电脑,因此它是从手机到车辆的直接 P2P 连接。知道怎么做吗?更糟糕的情况是,如果事情不成功,我只需要稍后连接路由器和笔记本电脑:( 你可以让它与具有足够快处理器的安卓手机一起使用 mplayer 或 ffmpeg 进行 MJPEG 解码,但我认为你最好在中间的某个地方使用 PC转码为 mpeg4 并保持 android 手机做标准的事情。如果它只是供私人使用,VLC 可能可以配置为为您进行转码(不确定它是否是面向 Web 的多客户端面向公众的服务器)。我想最后你更喜欢黑客攻击 - 奇怪的 android 东西或设置 PC 服务器。我希望这不是一架飞机。 我不希望在两者之间连接 PC,因为我的计划是从 android 手机直接 p2p 连接到车辆/相机。在这种情况下我可以参考的任何来源? :) 喜欢将 mjpg 转码为其他格式的源代码,比如说 jpg?以上是关于在 Android 上获取 IP Cam 视频流 (MJPEG)的主要内容,如果未能解决你的问题,请参考以下文章