2016-03-30 67 views
0

我开发Android为我的实习项目中的应用程序,它是一个流H264 DVR摄像机到Android作为client.Whenever我使用WiFi只有我可以连接到使用内部IP的DVR ,192.xxx.xxx.xxx与logcat的话说在3G的Android RTSP使用外部IP

04-04 14:30:14.680 1629-1629/? V/DefaultOmaSettingHelper: setSettingHeader: with uri=rtsp://192.xxx.xxx.xxx:554/user=xxx&password=xxx&channel=1&stream=0.sdp? 
04-04 14:30:14.682 827-1630/? V/SettingsProvider: call(system:MTK-RTSP-CACHE-SIZE) for 0 
04-04 14:30:14.682 827-1630/? D/SettingsProvider: lookupValue table system cache contains Key MTK-RTSP-CACHE-SIZE , value = Bundle[{value=null}] 
04-04 14:30:14.682 827-1674/? V/SettingsProvider: call(system:mtk_rtsp_min_udp_port) for 0 
04-04 14:30:14.682 827-1674/? D/SettingsProvider: lookupValue table system cache contains Key mtk_rtsp_min_udp_port , value = Bundle[{value=1024}] 
04-04 14:30:14.682 827-1699/? V/SettingsProvider: call(system:mtk_rtsp_max_udp_port) for 0 
04-04 14:30:14.683 827-1699/? D/SettingsProvider: lookupValue table system cache contains Key mtk_rtsp_max_udp_port , value = Bundle[{value=65535}] 
04-04 14:30:14.683 827-870/? V/SettingsProvider: call(system:mtk_rtsp_proxy_enabled) for 0 
04-04 14:30:14.683 827-870/? D/SettingsProvider: lookupValue table system cache contains Key mtk_rtsp_proxy_enabled , value = Bundle[{value=null}] 
04-04 14:30:14.684 1629-1629/? V/DefaultOmaSettingHelper: setOmaSettingHeader: params:minUdpPort=1024minUdpPort=1024maxUdpPort=65535rtspProxyEnable=0rtspProxyHost=nullrtspProxyPort=-1httpProxyEnable=0httpProxyHost=nullhttpProxyPort=-1httpBufferSize=10rtspBufferSize=4 
04-04 14:30:14.686 277-277/? I/MediaPlayerService: [setDataSource] setDataSource(rtsp://192.xxx.xxx.xxx:554/user=xxx&password=xxx&channel=1&stream=0.sdp?) 
04-04 14:30:14.689 277-277/? D/DrmMtkUtil/DrmUtil: checkDcf ----> path [rtsp://192.xxx.xxx.xxx:554/user=xxx&password=xxx&channel=1&stream=0.sdp?] 
04-04 14:30:14.689 277-277/? V/DrmMtkUtil/DrmUtil: checkExistence ----> [rtsp://192.xxx.xxx.xxx:554/user=xxx&password=xxx&channel=1&stream=0.sdp?] 
04-04 14:30:14.690 277-277/? I/NuPlayer: Is RTSP Streaming 
04-04 14:30:14.690 277-277/? D/RTSPSource: init+, RTSP uri headers from AP: 
04-04 14:30:14.690 277-277/? D/RTSPSource:  Authorization: Basic YWRtaW46 
04-04 14:30:14.690 277-277/? D/RTSPSource:  MAX-UDP-PORT: 65535 
04-04 14:30:14.691 277-277/? D/RTSPSource:  MIN-UDP-PORT: 1024 
04-04 14:30:14.691 277-277/? D/RTSPSource:  MTK-HTTP-CACHE-SIZE: 10 
04-04 14:30:14.691 277-277/? D/RTSPSource:  MTK-RTSP-CACHE-SIZE: 4 
04-04 14:30:14.691 277-277/? D/RTSPSource: removeSpecificHeaders MTK-RTSP-CACHE-SIZE 
04-04 14:30:14.691 277-277/? D/RTSPSource: special headers: MTK-RTSP-CACHE-SIZE = 4 
04-04 14:30:14.691 277-277/? I/RTSPSource: RTSP cache size = 4000000us 
04-04 14:30:14.692 277-277/? I/MediaPlayerService: [setDataSource] setDataSource(rtsp://192.xxx.xxx.xxx:554/user=xxx&password=xxx&channel=1&stream=0.sdp?) done 
04-04 14:30:14.697 277-2204/? D/MyHandler: RTSP Max UDP Port: 65535 
04-04 14:30:14.697 277-2204/? D/MyHandler: RTSP Min UDP Port: 1024 
04-04 14:30:14.705 277-2207/? I/ARTSPConnection: set nodelay return 0 
04-04 14:30:14.705 277-2207/? I/ARTSPConnection: connecting 192.168.0.18, 192.xxx.xxx.xxx:554 now 
04-04 14:30:14.706 277-2207/? I/ARTSPConnection: connection EINPROGRESS 
04-04 14:30:14.741 277-2207/? I/ARTSPConnection: status: RTSP/1.0 200 OK 
04-04 14:30:14.741 277-2207/? I/ARTSPConnection: line: 'Content-Type: application/sdp' 
04-04 14:30:14.742 277-2207/? I/ARTSPConnection: line: 'Server: H264DVR 1.0' 
04-04 14:30:14.742 277-2207/? I/ARTSPConnection: line: 'Cseq: 1' 
04-04 14:30:14.742 277-2207/? I/ARTSPConnection: line: 'Content-Base: rtsp://192.xxx.xxx.xxx:554/user=xxx&password=xxx&channel=1&stream=0./' 
04-04 14:30:14.742 277-2207/? I/ARTSPConnection: line: 'Cache-Control: private' 
04-04 14:30:14.742 277-2207/? I/ARTSPConnection: line: 'x-Accept-Retransmit: our-retransmit' 
04-04 14:30:14.742 277-2207/? I/ARTSPConnection: line: 'x-Accept-Dynamic-Rate: 1' 
04-04 14:30:14.742 277-2207/? I/ARTSPConnection: line: 'Content-Length: 356' 
04-04 14:30:14.743 277-2209/? I/ASessionDescription: s=RTSP Session 
04-04 14:30:14.743 277-2209/? I/MyHandler: base url rtsp://192.xxx.xxx.xxx:554/user=xxx&password=xxx&channel=1&stream=0./ 
04-04 14:30:14.754 277-2207/? I/ARTSPConnection: status: RTSP/1.0 200 OK 
04-04 14:30:14.755 277-2207/? I/ARTSPConnection: line: 'Server: H264DVR 1.0' 
04-04 14:30:14.755 277-2207/? I/ARTSPConnection: line: 'Cseq: 2' 
04-04 14:30:14.755 277-2207/? I/ARTSPConnection: line: 'Session: 193306800;timeout=60' 
04-04 14:30:14.755 277-2207/? I/ARTSPConnection: line: 'Transport: RTP/AVP;unicast;mode=PLAY;source=192.xxx.xxx.xxx;client_port=46234-46235;server_port=40000-40001;ssrc=0' 
04-04 14:30:14.755 277-2207/? I/ARTSPConnection: line: 'Cache-Control: private' 
04-04 14:30:14.755 277-2207/? I/ARTSPConnection: line: 'x-Dynamic-Rate: 1' 
04-04 14:30:14.759 277-2205/? I/RTSPSource: rtsp s=RTSP Session 
04-04 14:30:14.759 277-2205/? I/RTSPSource: convertMetaDataToMessage OK 
04-04 14:30:15.015 277-2207/? I/ARTSPConnection: status: RTSP/1.0 200 OK 
04-04 14:30:15.015 277-2207/? I/ARTSPConnection: line: 'Server: H264DVR 1.0' 
04-04 14:30:15.015 277-2207/? I/ARTSPConnection: line: 'Cseq: 3' 
04-04 14:30:15.017 277-2215/? I/ACodec: mSupportsPartialFrames 1 err 0 
04-04 14:30:15.018 277-2207/? I/ARTSPConnection: line: 'Range: npt=now-' 
04-04 14:30:15.018 277-2207/? I/ARTSPConnection: line: 'Session: 193306800' 
04-04 14:30:15.020 277-2213/? I/NuPlayerDecoder: mSupportsPartialFrames 1 

不过,如果我使用外部IP,60.xxx.xxx.xxx,使用Wi-Fi或3G我只得到logcat的

04-04 14:24:32.677 31474-31474/? V/DefaultOmaSettingHelper: setSettingHeader: with uri=rtsp://60.xxx.xxx.xxx:2218/user=xxx&password=xxx&channel=1&stream=0.sdp? 
04-04 14:24:32.678 827-1089/? V/SettingsProvider: call(system:MTK-RTSP-CACHE-SIZE) for 0 
04-04 14:24:32.678 827-1089/? D/SettingsProvider: lookupValue table system cache contains Key MTK-RTSP-CACHE-SIZE , value = Bundle[{value=null}] 
04-04 14:24:32.679 827-847/? V/SettingsProvider: call(system:mtk_rtsp_min_udp_port) for 0 
04-04 14:24:32.679 827-847/? D/SettingsProvider: lookupValue table system cache contains Key mtk_rtsp_min_udp_port , value = Bundle[{value=1024}] 
04-04 14:24:32.679 827-1002/? V/SettingsProvider: call(system:mtk_rtsp_max_udp_port) for 0 
04-04 14:24:32.679 827-1002/? D/SettingsProvider: lookupValue table system cache contains Key mtk_rtsp_max_udp_port , value = Bundle[{value=65535}] 
04-04 14:24:32.680 827-1674/? V/SettingsProvider: call(system:mtk_rtsp_proxy_enabled) for 0 
04-04 14:24:32.680 827-1674/? D/SettingsProvider: lookupValue table system cache contains Key mtk_rtsp_proxy_enabled , value = Bundle[{value=null}] 
04-04 14:24:32.681 31474-31474/? V/DefaultOmaSettingHelper: setOmaSettingHeader: params:minUdpPort=1024minUdpPort=1024maxUdpPort=65535rtspProxyEnable=0rtspProxyHost=nullrtspProxyPort=-1httpProxyEnable=0httpProxyHost=nullhttpProxyPort=-1httpBufferSize=10rtspBufferSize=4 
04-04 14:24:32.683 277-13212/? I/MediaPlayerService: [setDataSource] setDataSource(rtsp://60.xxx.xxx.xxx:2218/user=xxx&password=xxx&channel=1&stream=0.sdp?) 
04-04 14:24:32.683 277-13212/? D/DrmMtkUtil/DrmUtil: checkDcf ----> path [rtsp://60.xxx.xxx.xxx:2218/user=xxx&password=xxx&channel=1&stream=0.sdp?] 
04-04 14:24:32.683 277-13212/? V/DrmMtkUtil/DrmUtil: checkExistence ----> [rtsp://60.xxx.xxxx.xxx:2218/user=xxx&password=xx&channel=1&stream=0.sdp?] 
04-04 14:24:32.684 277-13212/? I/NuPlayer: Is RTSP Streaming 
04-04 14:24:32.684 277-13212/? D/RTSPSource: init+, RTSP uri headers from AP: 
04-04 14:24:32.684 277-13212/? D/RTSPSource:  Authorization: Basic YWRtaW46 
04-04 14:24:32.684 277-13212/? D/RTSPSource:  MAX-UDP-PORT: 65535 
04-04 14:24:32.684 277-13212/? D/RTSPSource:  MIN-UDP-PORT: 1024 
04-04 14:24:32.684 277-13212/? D/RTSPSource:  MTK-HTTP-CACHE-SIZE: 10 
04-04 14:24:32.684 277-13212/? D/RTSPSource:  MTK-RTSP-CACHE-SIZE: 4 
04-04 14:24:32.684 277-13212/? D/RTSPSource: removeSpecificHeaders MTK-RTSP-CACHE-SIZE 
04-04 14:24:32.684 277-13212/? D/RTSPSource: special headers: MTK-RTSP-CACHE-SIZE = 4 
04-04 14:24:32.684 277-13212/? I/RTSPSource: RTSP cache size = 4000000us 
04-04 14:24:32.686 277-13212/? I/MediaPlayerService: [setDataSource] setDataSource(rtsp://60.xxx.xxx.xxx:2218/user=xxx&password=xxx&channel=1&stream=0.sdp?) done 
04-04 14:24:32.692 277-32374/? D/MyHandler: RTSP Max UDP Port: 65535 
04-04 14:24:32.692 277-32374/? D/MyHandler: RTSP Min UDP Port: 1024 
04-04 14:24:32.696 277-32377/? I/ARTSPConnection: set nodelay return 0 
04-04 14:24:32.696 277-32377/? I/ARTSPConnection: connecting 60.xxx.xxx.xxx, 60.xxx.xxx.xxx:2218 now 
04-04 14:24:32.697 277-32377/? I/ARTSPConnection: connection EINPROGRESS 

那么谁能告诉我什么是我的问题?我需要使用套接字,数据包,输入/输出流,缓冲读写器还是其他任何东西?如果是这样,p租赁给我一些例子,让我可以学习如何使用它们

PS测试在真实设备上(Elephone P8000安卓5.0)

编辑

源代码流活动

public class liveActivity extends Activity{ 

final static String USERNAME = "xxx"; 
final static String PASSWORD = "xxx"; 
public static String domainName = "60.xxx.xxx.xxx"; 
public static int PORT = 2018; 
public static final String URL = "rtsp://192.xxx.xxx.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=0.sdp?"; 

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); 

    try{ 

    }catch (Exception e){ 
     e.printStackTrace(); 
    } 

    mPlayer1 = new MediaPlayer(); 
    mPlayer2 = new MediaPlayer(); 

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

      try { 

       mPlayer1.setDisplay(surfaceHolder); 
       Context context = getApplicationContext(); 
       Map<String, String> headers = getRtspHeaders(); 
       Uri source = Uri.parse(URL2); 
       mPlayer1.setDataSource(context, source, headers); 
       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); 

    /*final SurfaceView surfaceView2 = 
      (SurfaceView) findViewById(R.id.surfaceView2); 
    // Configure the Surface View. 
    surfaceView2.setKeepScreenOn(true); 
    // Configure the Surface Holder and register the callback. 
    SurfaceHolder holder2 = surfaceView2.getHolder(); 
    holder2.addCallback(mCallback2); 
    holder2.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);*/ 

} 


private Map<String, String> getRtspHeaders() { 
    Map<String, String> headers = new HashMap<String, String>(); 
    String basicAuthValue = getBasicAuthValue(USERNAME, PASSWORD); 
    headers.put("Authorization", basicAuthValue); 
    return headers; 
} 

private String getBasicAuthValue(String user, String password) { 
    String credentials = user + ":" + password; 
    int flags = Base64.URL_SAFE | Base64.NO_WRAP; 
    byte[] bytes = credentials.getBytes(); 
    return "Basic " + Base64.encodeToString(bytes, flags); 
} 

} 

注意:那些“xxx”仅用于安全目的

回答

0

它很难确定没有mor e信息并查看代码,但最可能的问题是您的提供商阻止了通过其网络的此类连接 - 某些运营商会阻止“上行链路”流式传输,要么保留带宽,要么可能认为它是VoIP服务与其中一项服务竞争。

它适用于无线网络的原因是最有可能的两个Android设备,你的相机是没有防火墙它们之间在同一网络上等等。

+0

感谢您的回应Mick,我怀疑类似于或类似于NAT相关的问题,但想知道是否还有其他可能导致它。我编辑了我的问题,并将源代码添加到所有process.It一个简单的代码,但如果我使用一些支持类,它会有所作为吗? –

+0

我无法看到您的代码形式快速扫描的任何问题。我建议您尝试通过网址将另一个流媒体播放器连接到您的相机,然后查看是否有问题 - 如果在Google Play上免费提供,则可以使用以下内容:https://play.google.com/store/apps/details?id=org .rtspplr.app&hl = en – Mick

+0

不幸的是唯一与我正在使用的DVR一起工作的应用程序是MEye,但是我提取了apk的代码,它的层次太高,我无法理解。感谢您的帮助 –