【问题标题】:playing a growing mp3 file on a web page在网页上播放不断增长的 mp3 文件
【发布时间】:2014-05-26 14:05:34
【问题描述】:

需要你的建议。

我有一个从 wav 生成 mp3 文件的网络服务。

转换过程需要时间,我希望访问者能够在转换仍在进行时立即开始收听。

尝试了html5标签后,我发现我只能播放在提取mp3文件时准备好的mp3文件部分。我的意思是,它似乎并不关心文件在获取后是否已经增长。

处理这种情况的正确方法是什么?

提前感谢您提供任何信息。

【问题讨论】:

    标签: html flash mp3 html5-audio audio-streaming


    【解决方案1】:

    我相信你可以使用JPlayer来玩它们。特点之一是它不预加载。

    编辑: HTML5 音频播放器也有 preload 属性,可以有以下值:

    “none”:不会预取任何东西

    “元数据”(不确定它是否是正确的词):会得到一些基本的东西,比如长度,采样率

    “auto”:将预取整个 mp3

    【讨论】:

    • preload 属性的
    • @user1312695 这里还有一些有趣的东西:PHP Streaming MP3
    • 那家伙的问题似乎很相似。感谢您的提示。
    【解决方案2】:

    您需要对服务过程进行更多控制,而不是将其留给您的网络服务器。

    当您的 Web 服务器响应 HTTP 请求时,它包含一个 Length: 标头,告诉客户端请求的资源有多大,以字节为单位。您的网络服务器将只发送请求时可用的长度,因为它不知道该文件将被附加到。客户端将下载所有这些数据,但从客户端的角度来看,它会下载整个文件,而实际上文件甚至还没有完成编码。

    要解决此问题,您需要将编码器的输出同时通过管道传输到文件和客户端。对于客户端的响应数据,根本不包含Length: 标头。大多数客户端将使用分块编码,允许您符合 HTTP/1.1。一些客户端(早期的 Android、旧的浏览器、旧的 VLC)无法处理分块编码,并且只会在数据进入时对其进行流式传输。

    具体如何执行此操作完全取决于您在服务器端使用的内容,而您没有在问题中指定。就个人而言,我为此使用 Node.js,因为它使过程非常简单。您可以简单地通过管道连接到两个流。请注意,如果您使用多管道方法,则管道只能以最慢的速度运行。一些流式客户端(例如 VLC)会降低 TCP 窗口大小,以不允许客户端缓冲太多数据。发生这种情况时,您对磁盘的写入将以客户端的速度运行。这对您来说可能无关紧要,但需要注意。

    【讨论】:

    • 谢谢,这正是我要做的(它证明在我的原型中工作)。我不会直接引用文件,而是制作像 stream.php?file=/mp3/123.php 这样的东西,它将在文件创建时对其进行流式传输。它会发送最终的“Lneght:”,幸运的是,mp3 的大小是已知的(不使用可变比特率)。唯一让我担心的是执行时间限制,如果一个文件正在构建,比如说,一分钟,那么这意味着stream.php的相应进程将存活相当长的时间。除了服务器重新配置有什么办法吗?
    • @user1312695 您的 MP3 的大小并不确切。虽然 CBR 非常接近指定的比特率,但它从来都不是精确的,因此不适合预测长度标头。完全关闭该长度标题。
    • 奇怪的是,在我的实验中,相同长度的 wav 的 CBR 总是给出相同大小的文件,最多一个字节。我使用默认设置的蹩脚编码器。无论如何,没有标头,客户端怎么知道没有更多的数据可以期待?
    • @user1312695 当服务器关闭TCP连接时,客户端知道没有更多数据了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多