【问题标题】:Proxying Videos locally with a TCP Socket使用 TCP 套接字在本地代理视频
【发布时间】:2009-04-05 06:42:33
【问题描述】:

我一直对向媒体浏览器添加对视频播客的支持非常感兴趣。

我希望用户能够浏览可用的视频播客并从互联网流式传输它们。这真的很容易,因为媒体播放器等会很乐意播放云中的文件。

问题是我想在本地缓存这些文件,以便后续观看同一集不会涉及流媒体,而是播放本地文件。

所以...我在想,为什么不托管HttpListener 并且当媒体播放器要求它提供文件的位时,让HttpListener 下载并存储在本地。下次用户播放文件时,我们将在本地拥有文件的某些部分。

有人知道使用HttpListener 进行代理的示例代码吗?

编辑

这个想法只是代理简单的流媒体内容,如 MP3 或 Mov。 赏金将用于实际实施。

这是我想要的 API:

// will proxy a uri on the local port, if cacheFile exists it will resume the 
// download from cacheFile.
// while the file is downloading it will be name cacheFile.partial, after the 
// download is complete the file will be renamed to cacheFile.
// Example usage: ProxyFile("http://media.railscasts.com/videos/176_searchlogic.mov", 8000, @"c:\downloads\railscasts\176_searchlogic.mov")
//
// Directly after this call http://localhost:8000 will be the proxy stream, it will be playable locally. 
void ProxyUri(Uri uri, int port, string cacheFile) 

编辑 2

HttpListener 看起来很没有希望我可能需要在 TCP 套接字级别完成这项工作,因为HttpListeners 似乎需要程序以管理员身份运行,这将非常棘手。

【问题讨论】:

  • 在提供实现之前...我想澄清一下要求。听起来您不仅想提供代理,还想提供下载内容的缓存,这样您就不需要每次用户想玩时都为内容往返......我说的对吗?
  • @Justin,完全可以,将使用 api 进行扩展。
  • 我用一个要点的链接更新了我的答案。
  • 回复。你的cmets:我不认为许可是一个问题。就不使用 HttpListener(由于管理员权限问题)而言 - 很公平,尽管您最初的问题确实专门针对 HttpListener 实现。
  • @Vinay,真的,正如我所说,除非有更好的实现,否则我会奖励你赏金,我暂时忽略了这个问题并忘记了 http 监听器限制(我遇到了一些几个月前我玩它的时候)

标签: c# .net proxy


【解决方案1】:

我之前没有对HttpListener 做过任何事情,所以我认为这是一个很好的小练习,可以让我自己跟上它的速度 - 事实证明。我将它实现为单个ProxyListener 类,其构造函数采用您指定的ProxyUri 函数的参数。一旦你获得了一个实例,你就可以通过调用它的Start 方法来开始它的监听(并且可能下载)。完成后,请致电Cleanup

有一个或两个粗糙的边缘,但基本上它可以根据您的问题工作。为了测试它,我将它构建为一个带有Program 类的控制台应用程序,该类接受由(uri、端口、文件名)组成的输入行,以空格分隔,创建ProxyListener 实例并启动它们。您可以运行此控制台应用程序,输入合适的行,然后下载程序将启动(将进度打印到控制台)。同时你可以例如启动 IE 并从指定端口获取文件,您将能够在下载器仍在工作时下载它。 “上传”进度也会打印到控制台。

我在这里粘贴它时遇到了一些麻烦,可能是由于大小(它没有那么大,但比您通常在这里看到的 sn-ps 大 - ProxyListener 类不到 200 行) .听起来很有趣吗?如果是这样,我会将其发布到 pastebin 并使用链接更新此答案。

更新:发布为gist

请注意,您需要管理员权限才能运行该程序,因为HttpListener 需要此权限。

更新 2: 在某些情况下,运行HttpListener 不需要管理员权限。请参阅 this linkthis one。这个想法是,如果您可以在安装期间保留一个 URL 命名空间,那么如果监听该命名空间,用户就不必拥有管理员权限。

【讨论】:

  • SO 对于长的 sn-ps 代码来说是出了名的糟糕,尝试发布一个要点而不是 gist.github.com,你介意我是否在 mediabrowser (www.mediabrowser.tv) 中使用此代码
  • 不,我不介意。毕竟,您在问题中提到了它。
  • 它看起来很像我想要的(仍然恢复支持会非常好),我也会让其他人有机会这样做,但如果在接下来的 48 小时内没有其他解决方案,我会赏金给你。 ...旁注,代码是在 GPL 下许可的,而 out 项目是在 MIT 下的,所以我们有一点许可计算性问题。
  • 嗯?我查看了 mediabrowser 网站,我得到的印象是 mediabrowser 是 GPL 许可的。我是从 mediabrowser.tv 的“关于”页面以及 videobrowser 的 Google 代码页面获得的。
  • 请参阅:code.google.com/p/videobrowser/source/browse/trunk/MediaBrowser/…,我们已经将部分移至 MIT,我们正在中途将其分离为 diff 程序集。
【解决方案2】:

流式传输并不是为了保存而设计的,而且这些协议非常自定义且实现起来非常复杂,流式会话会进行大量验证和同步,这将是非常难以模仿的。当然,这不是一项不可能完成的任务,而是一项相当大的任务。只有其他方法是读取并将其保存为本地媒体文件,并将其用作参考。因为你可以使用windows media encoder来读取流和写入流数据作为本地文件,但它仍然可能不允许你做复制保护数据。

【讨论】:

  • Akash,我不希望代理流只是可下载的文件。例如.. somewhere.com/xyz.wmv ,多种格式,例如。 mp3 在您下载整个文件之前可用。
【解决方案3】:

您是否考虑过使用具有缓存功能的 HTTP 代理?

喜欢:

另见Web Cache@维基百科

如果您希望您的应用程序具有这样的 Web 缓存组件,我建议您在 .Net 中寻找 Web Cache 实现,而不是从头开始编写代码。

【讨论】:

  • 不是真的,我想用一个 .net 应用程序部署它,配置最少。
猜你喜欢
  • 1970-01-01
  • 2012-09-10
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 2021-06-06
  • 2015-07-20
相关资源
最近更新 更多