我一直非常有兴趣在Media Browser中添加对视频播客的支持。
我希望用户能够浏览可用的视频播客并从互联网中流式传输。这很容易导致媒体播放器等......很乐意播放存在于云中的文件。
问题是我想在本地缓存这些文件,因此后续查看同一集不会涉及流式传输,而是播放本地文件。
所以......我在想,为什么不主持一个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
似乎要求程序以管理员身份运行,这将非常棘手。
答案 0 :(得分:3)
之前我没有和HttpListener
做过任何事情,所以我认为这将是一个很好的小练习,让我自己加快速度 - 事实证明。我将它实现为单个ProxyListener
类,其构造函数采用您指定的ProxyUri
函数的参数。获得实例后,通过调用其Start
方法开始监听(并可能下载)。完成后,请致电Cleanup
。
有一两个粗糙的边缘,但基本上它可以按照你的问题工作。为了测试它,我将它构建为一个带有Program
类的控制台应用程序,它接受由(uri,port,filename)组成的输入行,以空格分隔,创建ProxyListener
个实例并启动它们。您可以运行此控制台应用程序,键入合适的行,然后启动下载程序(将进度打印到控制台)。你可以同时例如启动IE并从指定端口获取文件,您可以在下载器仍在工作时下载它。 “上传者”进度也将打印到控制台。
我在这里粘贴它有点麻烦,可能是由于尺寸(它不是那么大,但比你通常在这里看到的片段大 - ProxyListener
类有点不到200行) 。听起来有趣吗?如果是这样,我会将其发布到pastebin并使用链接更新此答案。
更新:以gist发布。
请注意,您需要管理员权限才能运行该程序,因为HttpListener
需要此功能。
更新2:在某些情况下,没有必要拥有运行HttpListener
的管理员权限。请参阅this link和this one。我们的想法是,如果您可以在安装期间保留URL命名空间,则用户在侦听该命名空间时不必具有管理员权限。
答案 1 :(得分:0)
流式传输不是为了保存而设计的,而且这些协议非常自定义且实现起来非常复杂,流媒体会话会进行大量的验证和同步,这些都很难模仿。当然,这不是一项不可能完成的任务,但却是一项相当重要的任务。只有其他方式是读取并将其保存为本地媒体文件,并将其用作参考。因为您可以使用Windows媒体编码器来读取流并将流数据写为本地文件,但它仍然可能不允许您复制受保护的数据。
答案 2 :(得分:0)
您是否考虑过将HTTP代理与缓存功能结合使用?
像:
mod_proxy
和mod_cache
另请参阅Web Cache @ wikipedia
如果您希望您的应用程序具有此类Web缓存组件,我建议您在.Net中查找Web缓存实现,而不是从头开始编写代码。