我正在为我的实习项目开发一个android应用程序,该应用程序是将H264 DVR相机流式传输到android作为客户端。每当我使用Wifi时,我只能使用内部IP 192.xxx.xxx.xxx连接到DVR,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
有人能告诉我我的问题是什么吗?我需要使用套接字、数据包、输入/输出流、缓冲区恐惧器/写入器或任何东西吗?如果是,请给我一些例子,这样我就可以学习如何使用
p.S在真实设备上测试(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);
}
}
注意:这些"xxx"仅用于安全目的
如果没有更多信息和代码,很难确定,但最有可能的问题是您的提供商正在阻止其网络上的这种类型的连接-一些运营商会阻止"上行链路"流媒体流量,要么是为了保持带宽,要么是因为他们可能认为这是一种类似VoIP的服务,与他们的某项服务竞争。
它在WiFi上工作的原因是,很可能你的Android设备和相机都在同一个网络上,它们之间没有防火墙等。