gpt4 book ai didi

java - 在流式传输 URL 时获取对 Android VideoView 的访问权限

转载 作者:行者123 更新时间:2023-11-30 08:55:47 24 4
gpt4 key购买 nike

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 的网址反而。还有,现在其他videoView实例可以从同一个本地主机 url 下载。

要使其与其他手机一起使用,您的服务器当然不能在 localhost 上运行.
当然我没有实现这个,但这只是我能想到的一种解决方案。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com