C#: 从服务器流式传输音频文件到客户端

6
我正在编写一个应用程序,它将允许用户安装某种形式的应用程序(可能是Windows服务),该程序将在其PC上打开一个端口,并给定硬盘上的特定目标后,将能够流式传输mp3文件。
然后,我将有另一个应用程序,它将连接到服务器(即用户的电脑),并能够通过连接到该PC(远程)来浏览托管数据,给定端口,从服务器向应用程序流式传输mp3文件。

我在网上找到了一些教程,但大部分都是关于C#文件服务器的,它们只能下载整个文件。我想要的是流式传输mp3文件,以便在下载一定数量的字节时开始播放(即在缓冲时播放)。


我该如何完成这样的任务?具体来说,我需要知道如何编写此应用程序(稍后将其转换为Windows服务),以便在指定端口上侦听文件流,从而可以通过以下方式访问文件:http://<serverip>:65000/acdc/wholelottarosie.mp3,并希望能够在WPF MediaPlayer中流式传输该文件。

[更新]

我正在学习一个关于构建文件服务器并将文件从服务器发送到客户端的教程。 我需要做类似的事情吗?

[更新]

目前正在阅读这篇文章:使用C#从流播放音频,我认为它非常有前途,可以让我播放流媒体文件;但我仍然不知道如何从服务器实际流式传输文件。

2个回答

9
流媒体和下载之间没有有效的区别。它们是一样的东西。任何区别纯粹是语义上的。
如果您想,可以从任何Web服务器“下载”MP3并在下载时开始播放它。这只需要缓冲一些数据并立即将其发送到解码和播放例程。
同样,即使所谓的“流媒体”服务器也可以下载。您只需将字节保存为它们正在通过电线发送的文件。
“流媒体”应用程序只是不设计将文件保存到磁盘的应用程序。
编辑:
有一个例外。两个真正的例外:
首先,如果您正在流式传输“实时”音频,例如无需100%可靠性的广播或其他类型,则使用UDP进行流式传输。如果需要,仍然可以保存此内容,但它更多地基于数据包而不是基于流。
第二种情况是使用加密时,此时您仍然可能保存文件,但是如果没有加密算法和密钥,则该文件将无用。

你可以从IIS流式传输,或使用"Cassini"服务器编写自己的流媒体服务器。这并不难做到。只需将它们放在网站上的一个文件夹中。请记住,在Web中,空格通常是%20或+,例如http://server/john%20Cougar%20Mellencamp.mp3 或 http://server/john+Cougar+Mellencamp.mp3。 - Rick Rat

3

这完全不是真的。

文件下载和HTTP多媒体流之间的区别在于编码头,流的编码头设置为分块编码。此外,文件下载具有Content-Length头,因此接收系统可以提前知道文件大小。

多媒体流没有Content-Length头,因此没有预期的终点。相反,只有连续的数据块不断被接收和处理,只要它们继续出现。


我觉得你假设“流媒体”意味着直播、无休止的内容,但这不一定是真的。例如,Pandora以及其他一些音乐服务提供单独文件的流媒体。视频通常被“流式传输”,但有明确的开始和结束点。"Stream"指的是播放正在传输的文件的动作,而不是数据永无止境的流。 - Erik Funkenbusch
@MystereMan - 弗雷德的回答和你的理解之间可能存在一些不一致。他并不是在暗示流不能有一个定义好的终点,而是客户端直到到达那个终点之前从未意识到它在哪里。就它而言,它可能会无限地继续下去。 - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接