2016-05-16 197 views
1

我有一台DVR作为连接到摄像机的服务器。我试图将摄像机的视图流到我的android手机中。我设法通过局域网实现,但通过3g /手机失败从DVR接收rtsp流

我做

端口转发

使用DynDNS的

称为MEye(只在我的情况下工作的应用程序)的第三方应用程序

下面是代码

public class liveActivity extends Activity{ 

final static String USERNAME = "admin"; 
final static String PASSWORD = ""; 
public static String domainName = "xxx.dvrdns.org"; 
public static int PORT = 2218; 
public static final String URL = "rtsp://192.168.0.xxx:554/user=" + USERNAME + "&password=" + PASSWORD + "&channel=1&stream=0.sdp?"; 
public static final String URL2 = "rtsp://" + domainName + ":" + PORT + "/user=" + USERNAME + "&password=" + PASSWORD + "&channel=1&stream=1.sdp?real_stream--rtp-caching=100"; 

private MediaPlayer mPlayer1; 
private MediaPlayer mPlayer2; 
SurfaceHolder.Callback mCallback1; 
SurfaceHolder.Callback mCallback2; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_live); 

    mPlayer1 = new MediaPlayer(); 

    mCallback1 = new SurfaceHolder.Callback() { 
     @Override 
     public void surfaceCreated(SurfaceHolder surfaceHolder) { 

      try { 

       mPlayer1.setDataSource(liveActivity.this, Uri.parse(URL2)); 
       mPlayer1.setDisplay(surfaceHolder); 
       mPlayer1.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
        @Override 
        public void onPrepared(MediaPlayer mediaPlayer) { 
         mPlayer1.start(); 
        } 
       }); 
       mPlayer1.prepareAsync(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) { 

     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 

      mPlayer1.release(); 
     } 
    }; 

    final SurfaceView surfaceView1 = 
      (SurfaceView) findViewById(R.id.surfaceView1); 
    // Configure the Surface View. 
    surfaceView1.setKeepScreenOn(true); 
    // Configure the Surface Holder and register the callback. 
    SurfaceHolder holder1 = surfaceView1.getHolder(); 
    holder1.addCallback(mCallback1); 
    holder1.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

} 

P.S我从一个软件工程师听说RTSP是当地only.Is我为什么不能通过3G流?

回答

0

这是一个老问题,但以防万一...

鉴于您的解决方案是工作在局域网,想必通过WiFi,这种方法本身听起来不错。

您最可能遇到的问题是您的蜂窝网络提供商不支持RTSP流,无论是上传,下载还是两者。

这些类型的限制在移动网络中并不少见 - 例如,一些运营商用于阻止所有上行流协议以避免VoIP服务。