在Android上获取IP Cam视频流(MJPEG)

时间:2010-12-20 14:51:36

标签: android video stream camera ip

我目前正在以3人为一组进行AndAR项目。我是负责Android手机视频流的人。 我得到了一台D-Link DCS-920 IP摄像机,我发现它使用MJPEG编解码器作为直播视频流,网络服务器使用Jview来观看直播。据我所知,MJPG不是Android操作系统支持的文件类型所以我想出了一个想法,而不是使用ImageView,我使用WebView来传输视频。 我实现了一个非常简单的概念,它的工作原理!但问题是,刷新率很糟糕。 我得到视频图像(例如:http://192.168.1.10/image.jpg)在WebView上查看并实现一个Timer来控制刷新率(假设它设置为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&current=video.jpg (没有足够的点张贴图片):(

我只需要将视频流制作成15-30fps左右。任何建议/帮助将非常感激:)谢谢!

5 个答案:

答案 0 :(得分:1)

您可以使用Raspberry PI代替Arduino,它应该有足够的CPU能力来控制车辆并同时转换视频流。当然,您需要将所有Arduino软件移植到Raspberry ......

答案 1 :(得分:0)

MJPEG是一种将动态视频传送到移动设备的非常低效的方式,因为每个帧都是按照自己独立的图像进行压缩。对于不需要视频的应用程序(有人在上周询问相机正在观看等待线路),你每隔一秒左右推一个静态帧的解决方案听起来不错。

如果您需要动态视频,我建议您在网络服务器上从MJPEG转码到支持视频格式,该格式使用帧到帧压缩。通过用户的3g连接以及从服务器到其所有客户端,这将导致数据推送的数量要少得多。你应该只需要运行一个代码转换引擎来支持所有客户端 - 你将能够使用相同的一个用于android和amp; iphone设备,如果你的相机输出足够合理,你可能想要为平板电脑和电脑提供更高分辨率的输出。

答案 2 :(得分:0)

在android上,如果我们用CPU解码一个jpeg,它将花费40-100ms。如果我们想播放mjpeg到15-30fps,我们需要硬件jpeg解码器。

答案 3 :(得分:0)

有一个有用的previous SO discussiongreat one with code。如果这对你有用,你会试着告诉我们。

答案 4 :(得分:0)

您可以使用MjpegView类直接显示mjpeg流。 https://code.google.com/p/android-camera-axis/source/browse/trunk/serealisation/src/de/mjpegsample/MjpegView/MjpegView.java?r=33

你必须在这个类上实现一些AsyncTasks才能正常工作。

祝你好运