2

我有一个 DVR 作为连接到相机的服务器。我正在尝试将相机的视图流式传输到我的 android 手机中。我设法通过 LAN 做到这一点,但通过 3g/蜂窝失败

我已经搞定了

转发端口

使用 DynDNS

名为 MEye 的第 3 方应用程序(仅适用于我的应用程序)

这是代码

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

}

PS 我从一位软件工程师那里听说 RTSP 仅适用于本地。这就是我无法通过 3g 流式传输的原因吗?

4

1 回答 1

0

这是一个老问题,但以防万一......

鉴于您的解决方案在 LAN 中工作,可能是通过 WiFi,该方法本身听起来不错。

您最有可能遇到的问题是您的蜂窝网络提供商不支持 RTSP 流,无论是上传、下载还是两者都支持。

这些类型的限制在移动网络中并不少见——例如,一些运营商曾经阻止所有上行流协议以避开 VoIP 服务。

于 2017-11-06T21:23:53.880 回答