c# - 使用 TCP 套接字在本地代理视频

标签 c# .net proxy

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

我希望用户能够浏览可用的视频播客并从 Internet 流式传输它们。这真的很容易,因为媒体播放器等.. 会很高兴地播放云端的文件。

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

所以...我在想,为什么不托管一个 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 套接字级别完成这项工作,因为 HttpListener 似乎要求程序以管理员身份运行,这将真的很棘手。

最佳答案

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

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

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

更新:发布为 gist .

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

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

关于c# - 使用 TCP 套接字在本地代理视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/718478/

相关文章:

c# - 在新行上写入文本 (ASP.NET MVC)

c# - Entity Framework 不提供 DeleteAsync 或 AddAsync。为什么?

python - 在 Python 中使用代理运行 Selenium Webdriver

macos - 防止网络设置询问密码

php - 是否有一个用 PHP 编写的真正的代理,或者我需要做什么才能实现一个代理?

c# - 这个 BlockingQueue 线程安全吗?

c# - 忘记密码网址

c# - 验证内容页中内容控件的 ContentPlaceHolderID 属性

c# - 使用 Mud Blazor,我如何在页面底部获得一个持久抽屉?

c# - 在 API 中使用任务并行库