将mp3从服务器流式传输到html5音频时传递持续时间
我有一个node.js服务器正在转换和流媒体MP3。 我正在使用一个HTML5音频标签来消费这个流,而我遇到的问题是音频元素不知道mp3的播放时间,直到它完成播放整个事情(显然)。 有没有办法,因为我的服务器在发送之前知道mp3的持续时间,我可以在服务器的响应头中包含持续时间或其他内容,因此使用它的客户端知道持续时间?
谢谢
我认为,就目前而言,就广泛支持的解决方案而言,您被阻止通过单独的请求发送该内容(或者以其他方式在您的链接的某种清单中 - 包括在您用来指向的播放列表中例如,适当的URI)。 当然,这可能会由服务器动态生成,首次添加歌曲时,然后从静态服务器开始。
在我正在创建的媒体播放器中,我正在做类似于此的操作 - 下载包含通常位于.mp3元数据(也将支持非mp3版本等)内的json文件。
这远非理想,但它也是html5音频/视频在第一次迭代中无法解决的问题之一。
一岁半,但我刚刚碰到这个上周,所以......
将206部分内容支持添加到您的http服务器实现中,并且此问题消失。 在内容中寻找也开始工作..
音频和视频HTML5标签正在制作范围请求:
Range: bytes=0- or..
Range: bytes=0-12345
规范正确回应的重要部分:
HTTP/1.1 206 PARTIAL CONTENT
Accept-Ranges: bytes
Content-Range: bytes 0-12345
没有206响应代码,你会得到你正在经历的行为。
我在Perl中这样做,其中$ request包含来自客户端的请求标头,标准化。 例如,在大多数情况下,SERVER_PROTOCOL包含'HTTP / 1.1'
my $crlf = " 12";
if ( $request->{RANGE} && $request->{RANGE} =~ /bytes=(d*)-(.*)$/ ) {
$offset = $1;
$end = $2 || $size; # end is optional in the spec. Default to size.
$header = $request->{SERVER_PROTOCOL} . ' 206 PARTIAL CONTENT' . $crlf .
'Content-Range: bytes ' . $offset . '-' . $end . '/' . $size . $crlf;
} else {
$header = $request->{SERVER_PROTOCOL} . ' 200 OK' . $crlf;
}
my $left = $end - $offset;
$header .= 'Server: ' . $SERVER_NAME . $crlf .
'Accept-Ranges: bytes' . $crlf .
'Date: ' . $http_date . $crlf .
'Content-Type: ' . ($self->simplemime($raw_path) || magic($fh)) . $crlf .
'Last-Modified: ' . $http_date . $crlf .
'Content-Length: ' . $size . $crlf .
'Connection: Keep-Alive' . $crlf .
'Cache-Control: max-age=' . $EXPIRE . $crlf . $crlf;
您当然必须通过为请求的内容提供适当的字节范围来遵守请求。
客户端通常也会“拖延”下载以匹配播放速度,因此适当的事件驱动服务器(如Mojolicious,AnyEvent或Node.js)将进行扩展,而每个连接模型(如PHP)的1个线程则不会。 (好吧,我想棘轮会用一些黑客攻击,或者使用Xsendfile)
顺便提一下,大多数Range请求最终只是:
Range: bytes=0-
这意味着只要他们不能寻找和缓存被禁用(并且浏览器实际上是尊重它的话),你实际上可以逃避仅仅重写正常HTTP / 1.1 200响应的头部到HTTP / 1.1 206响应,它适用于某些内容。 具体来说,这似乎适用于文件末尾没有所需元数据的内容。 对于那些文件类型,我已经看到了范围请求,它们试图结束,然后在文件的开始处重新启动。 出于这个原因,最好只实施实际的搜寻,但上述确实有效......以自己的风险使用。
看看这里:类似的问题
我认为这是你正在寻找的。
链接地址: http://www.djcxy.com/p/60733.html上一篇: Passing duration when streaming mp3 from server to html5 audio