Android RTSP более 3 г с использованием внешнего IP

Я разрабатываю приложение для Android для моего проекта стажировки, которое представляет собой потоковую передачу видеорегистратора H264 на Android в качестве клиента. Когда я использую только Wi-Fi, я могу подключиться к видеорегистратору, используя внутренний IP, 192.xxx.xxx.xxx с logcat поговорка

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

Так может кто-нибудь сказать мне, в чем заключается моя проблема? Нужно ли мне использовать сокет, пакет,input/outputtream,bufferedreader/writer или что-то еще? Если да, пожалуйста, дайте мне несколько примеров, чтобы я мог научиться их использовать

PS Проверено на реальном устройстве (Elephone P8000 Android 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);
}

}

Примечание: эти "ххх" предназначены только для целей безопасности

1 ответ

Решение

Трудно быть уверенным без дополнительной информации и просмотра кода, но наиболее вероятная проблема заключается в том, что ваш провайдер блокирует этот тип соединения через свою сеть - некоторые операторы блокируют потоковый трафик "восходящей линии связи", чтобы сохранить пропускную способность или потому, что они могут думаю, что это VoIP-подобный сервис, конкурирующий с одним из их сервисов.

Причина, по которой он работает в Wi-Fi, заключается в том, что скорее всего ваше устройство Android и камера находятся в одной сети без межсетевых экранов и т. Д. Между ними.

Другие вопросы по тегам