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

标签 java android video-streaming native android-videoview

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

假设手机已root。

最佳答案

简短的回答是否定的,据我所知。

长答案是您没有提供足够的细节。您到底需要访问哪些数据?您是否正在编写应用程序,或者修改您的操作系统以对其他应用程序执行此操作?

实际获取远程视频的代码位于 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 ,如果不是,则它是私有(private)的(因此子类化在这里不起作用)。

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

或者,您可以考虑修改 SurfaceMediaPlayer 吸引。大部分相关代码仍然是native不过。

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

This answer建议在 androidxref.com 查找 native 代码

编辑:

根据要求,这里更详细地介绍了“代理服务器”解决方案的外观。我不知道Android上的实现细节。

基本上,当您获得要在 VideoView 中播放的 URL 时,您可以将其传递到您自己的服务器。类似 startProxyServer(videoUrl) 。这将启动一个服务器,该服务器下载并重新托管视频。要使其在本地工作,请启动一个网络服务器,监听 localhost 。服务器只是下载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 上运行.
当然我还没有实现这个,但这只是我能想到的一种解决方案。

关于java - 在流式传输 URL 时获取 Android VideoView 收到的数据包的访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28881359/

相关文章:

android - 如何以编程方式实现摇动动画?

Android:扫描目录并显示图片(缩略图)(图片不存储在媒体存储中)

android - 从我的 Android 应用程序重置成就/排行榜

python - 使用 OpenCV VideoWriter 和 Python BytesIO 在内存中流式传输视频

javascript - Android 的 WebRTC 支持

java - 如何在任何计算机上使用 Java 默认打开 Java 程序

java - SauceLabs Java 原型(prototype)中的奇怪版本号

java - Derby INSERT SELECT 空指针异常

java.io.IOException : setDataSource failed 异常

java - 解析 java.nio.files.Path 时忽略前导斜杠的最佳方法是什么