为了账号安全,请及时绑定邮箱和手机立即绑定

某些浏览器中生成音频的计时问题

某些浏览器中生成音频的计时问题

PHP
慕桂英3389331 2023-07-08 20:13:03
我需要从 mp3 文件生成音频。所以我使用curl库来获取文件,然后设置所需的标头和echo音频内容。问题是它在 Chrome 和 Safari 浏览器中无法正常工作。音频文件正在加载,并开始播放,但您无法更改时间(无法.currentTime在 JavaScript 中设置,而且在浏览器中定时滑块不起作用)。(在 Firefox 中工作正常)。代码:php            $agent = 'stagefright/1.2 (Linux;Android 5.0)';            $url = 'http://www.jplayer.org/audio/mp3/Miaow-07-Bubble.mp3';            $ch = curl_init($url);            curl_setopt($ch, CURLOPT_URL, $url);            curl_setopt($ch, CURLOPT_HEADER, 0);            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1) ;            curl_setopt($ch, CURLOPT_REFERER, 'http://www.jplayer.org/');            curl_setopt($ch, CURLOPT_USERAGENT, $agent);            $media = curl_exec($ch);            curl_close($ch);            $content_length = strlen($media);            $type = "audio/mpeg";            header("Content-type: ".$type);            header("Content-length: ".$content_length);            echo $media;            exit;有任何想法吗?也许我错过了一些 php 标头?谢谢。
查看完整描述

1 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

正如我猜测的,我缺少一个 php 标头。

需要添加以下标题:

header('Accept-Ranges: bytes');

添加Accept-Ranges标头修复了 Chrome 的问题。但对于 safari,您需要检查HTTP_RANGE并添加Content-Range标头。

这是我的实现,它在所有主要浏览器中都能正常工作。

        $content_length = strlen($media_total);

        $total_bytes = $content_length;

        $content_length_1 = $content_length - 1;


        if (isset($_SERVER['HTTP_RANGE'])) {


            $byte_range = explode('-',trim(str_ireplace('bytes=','',$_SERVER['HTTP_RANGE'])));


            $byte_from = $byte_range[0];

            $byte_to = intval($byte_range[1]);

            $byte_to = $byte_to == 0 ? $content_length_1 : $byte_to;


            $media_total = substr($media_total,$byte_from,$byte_to);


            $content_length = strlen($media_total);


            header('HTTP/1.1 206 Partial Content');

        }

        else {

            $byte_from = 0;

            $byte_to = $content_length_1;

        }


        $content_range = 'bytes '.$byte_from.'-' . $byte_to . '/' . $total_bytes;


        header('Accept-Ranges: bytes');

        header("Content-Range: ".$content_range);

        header("Content-type: ".$type);

        header("Content-length: ".$content_length);

        header('Content-Transfer-Encoding: binary');


        echo $media_total;


        exit;


查看完整回答
反对 回复 2023-07-08
  • 1 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信