【问题标题】:Android bindProcessToNetwork and RTSP stream through MediaPlayerAndroid bindProcessToNetwork 和 RTSP 通过 MediaPlayer 流式传输
【发布时间】:2017-02-02 02:14:13
【问题描述】:

我有一个应用程序正在使用 bindProcessToNetwork() 来强制通过 wifi 连接进行所有连接。这样做是因为 wifi 连接连接到没有 Internet 连接的摄像头,所以自然 android 会尝试通过具有完整 Internet 连接的蜂窝数据连接将所有流量推出。代码是:

final ConnectivityManager connection_manager =
            (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkRequest.Builder request = new NetworkRequest.Builder();
    request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);

    connection_manager.requestNetwork(request.build(), new ConnectivityManager.NetworkCallback()
    {
        @Override
        public void onAvailable(Network network)
        {
            try {
                connection_manager.bindProcessToNetwork(network);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

当通过 HTTP 连接到相机以发出命令等时,这可以正常工作。但是,当启动 RTSP 流并尝试通过 android MediaPlayer 查看它时,它不会连接。媒体播放器的代码:

mMediaPlayer = new MediaPlayer();
mMediaPlayer.setSurface(new Surface(mTextureView.getSurfaceTexture()));
mMediaPlayer.setWakeMode(getActivity().getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
mMediaPlayer.setDataSource(loc);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.prepareAsync();

如果我禁用手机上的蜂窝数据,则代码可以正常运行并且 RTSP 流可以正常播放,因为默认路由是通过 wifi 网络输出的。但是,当两个网络都连接时,似乎 RTSP 请求没有通过 wifi 连接到达相机。就好像只有 HTTP 请求被 bindProcessToNetwork() 强制通过 wifi。情况并非如此,尽管在应用程序的其他地方使用 [InetAddress.isReachable()][1]

对相机进行 ping 操作

有没有办法强制 MediaPlayer RTSP 连接也通过 wifi 连接?

【问题讨论】:

  • 问题解决了吗?我也遇到了同样的问题。

标签: android networking rtsp


【解决方案1】:

根据我阅读的有关媒体播放器 API 的信息,媒体播放由运行在单独进程 (lookie here) 上的 MediaServer 处理。当您调用 bindProcessToNetwork 时,您会强制您的应用(在其自己的进程上运行)仅使用 WiFi 网络,这将具有 no effect on MediaServer's behaviour(因为它在与您的应用不同的进程上运行)。

看来您的选择是将媒体文件拉到 android 设备上并将其作为本地文件播放而不是流式传输。

【讨论】:

  • 我们最终做的是使用 ffmpeg。您可以将库编译到应用程序中,它作为同一进程的一部分运行,因此 bindProcessToNetwork 然后按预期执行。
  • 你是对的。这样您仍然可以流式传输,而无需先将文件下载到您的设备。
  • @Kebabman 你能给我们举个例子,说明你是如何在同一进程下运行它的吗?通常,它使用Runtime.getRuntime().exec("ffmpeg") 运行,将其分隔到不同的进程。
  • @Danpe - 我猜你使用的是 ffmpeg 可执行文件吗?
猜你喜欢
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多