2016-05-16 196 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服務。