android rtsp 超过 3g 使用外部 IP

android rtsp over 3g using external IP

我正在为我的实习项目 android 开发一个应用程序,它将 H264 DVR 摄像机流式传输到 Android 作为 client.Whenever 我只使用 Wifi 我可以连接到DVR 使用内部 IP,192.xxx.xxx.xxx with logcat saying

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,使用 WiFi 或 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

所以谁能告诉我我的问题是什么?我需要使用socket,packet,input/outputstream,bufferedreader/writer什么的吗?如果是这样,请给我一些例子,以便我学习如何使用它们

P.S 在真实设备上测试(Elephone P8000 Android 5.0)

编辑

流媒体的源代码activity

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" 仅用于安全目的

如果没有更多信息和查看代码,很难确定,但最有可能的问题是您的提供商在其网络中阻止了这种类型的连接——一些运营商会阻止 'uplink' 流媒体流量,或者以保留带宽,或者因为他们可能认为这是与他们的一项服务竞争的类似 VoIP 的服务。

它在 WiFi 上工作的原因是您的 Android 设备和相机很可能在同一个网络上,它们之间没有防火墙等。