在Android VideoView上获取访问权限在流式传输URL时收到数据包



VideoView的本地代码是否在解码之前或解码之后访问接收到的视频数据包?我需要访问这些数据包,以便将它们传输到另一个设备。最初的解决方案是修改Android原生代码。我发现的其他可能的解决方案是使用GStreamer或FFmpeg库。为了实现这个目标,我需要一些指导。

假设手机已生根。

简短的回答是否定的,我不知道。

长话短说,你们并没有给出足够的细节。您究竟需要访问哪些数据?您是在编写应用程序,还是在修改操作系统以对其他应用程序执行此操作?

实际获取远程视频的代码在MediaPlayer中,并且是本机代码。参见MediaPlayer中的以下方法:

private void setDataSource(/* snip */) throws /* snip */ {
    /* snip */
    else if (scheme != null) {
        // handle non-file sources
        nativeSetDataSource(
            MediaHTTPService.createHttpServiceBinderIfNecessary(path),
            path,
            keys,
            values);
        return;
    }
    /* snip */

不幸的是,几乎所有相关的MediaPlayer代码都是native,如果不是,它是私有的(因此子类化在这里不起作用)。

但是,根据您需要执行的操作,您可能会覆盖VideoView方法setVideoURI(Uri, Map<String, String>),它是公共的。在这里,您可以获取URI,然后通过自己的web服务或其他方式代理它。不过,这并不是你想要的。

或者,您可以考虑修改由MediaPlayer绘制的Surface。不过,大多数相关代码仍然是native

我要提到的最后一种可能性(可能有数百种可能的方法)是修改MediaHTTPService类。这似乎是由MediaPlayer使用的,但我不能确定,因为如果使用它,它就会在本机代码中使用。

此答案建议在androidxref.com 上查找本机代码

编辑:

根据要求,这里提供了关于"代理服务器"解决方案的更多细节。我不知道安卓系统的实现细节。

基本上,当您在VideoView中获得要播放的URL时,您会将其传递给自己的服务器。类似startProxyServer(videoUrl)。这将启动一个服务器,该服务器下载视频,然后重新托管视频。要在本地工作,请启动一个侦听localhost的Web服务器。服务器只是在videoUrl下载视频,在本地保存,然后在localhost:port/?video=${videoUrl}托管。

因此,在非常高级的伪代码中,服务器可能看起来像。

public void startProxyServer(String videoUrl) {
  int PORT = 28641; // random port
  File f = downloadFile(videoUrl);
  saveFile(f, '/path/to/server/storage');
  startWebServer('localhost', PORT);
}

所以现在您将localhost:port/?video=${videoUrl}作为videoView的url。此外,现在其他videoView实例可以从同一本地主机url下载。

为了让它与其他手机配合使用,你的服务器当然不能在localhost上运行
当然,我还没有实现这一点,但这只是我能想到的一个解决方案。

最新更新