使用PHP输出视频流的一个坑

前几天用 PHP 做了一个输出视频流的接口,本地测试的时候一切OK,但是到了测试服务器之后视频在前端播放器中就出错了:

开始以为是服务器视频目录不正确,又怀疑是 header 头信息,又怀疑 MP4 视频编码,又检查目录权限……各种能想到的问题都试了,还是没能解决这个问题。但是单独访问服务器视频又可以正常播放,后来在 Firefox 的调试窗口对比两者到底有什么差异,终于在响应那一栏发现了些许不同:

两者的差别就在于多出来的 “77u/” 的这四个字符,经各种百度最终播放的问题算是解决了。其实就是在 PHP 输出视频之前前加了一个缓冲区过滤输出:

private function PutMovie($file) {
        ini_set('memory_limit','512M');
        header("Content-type: video/mp4");
        header("Accept-Ranges: bytes");

        ob_start();    // ------ 开启缓冲区
        $size = filesize($file);

        if(isset($_SERVER['HTTP_RANGE'])){        
            header("HTTP/1.1 206 Partial Content");
            list($name, $range) = explode("=", $_SERVER['HTTP_RANGE']);
            list($begin, $end) =explode("-", $range);
            if($end == 0) $end = $size - 1;
        }
        else {
            $begin = 0; $end = $size - 1;
        }

        header("Content-Length: " . ($end - $begin + 1));
        header("Content-Disposition: filename=".basename($file));
        header("Content-Range: bytes ".$begin."-".$end."/".$size);

        try {
            $fp = fopen($file, 'r');
        } catch (\Exception $e) {
            echo $e->getTraceAsString();exit;
        }
        fseek($fp, $begin);
        $contents = '';

        while(!feof($fp)) {
            $p = min(1024, $end - $begin + 1);
            //$begin += $p;
            $contents .= fread($fp, $p);
            //echo fread($fp, $p);
        }
        //$contents = ltrim($contents, "\XEF\XBB\XBF");
        ob_end_clean();            // ------ 清除缓冲区 
        ob_clean();        
        //$contents = substr($contents, 3);
        fclose($fp);

        exit($contents);
}

造成这个问题的原因大概与 PHP 无法识别 UTF8 BOM 头有关(但其实我的 PHP 文件都是不带 BOM 头的),关于 BOM 的文章随便百度一下就有很多。具体的原因呢我也懒得去研究了,太折腾人了 ! -_-

另外,还有文章说大部分浏览器只支持 H264(也被称作 AVC)编码格式的 MP4 文件,而不支持 MPEG-4 编码的视频。可以使用 MediaInfo 这个软件去查看视频的编码信息:

如果红圈那里显示的是 MPEG-4 Visual,那么此视频很有可能在网页里也无法正常播放。用视频转换器转一下格式即可:

参考:

https://www.cnblogs.com/wt645631686/p/6868826.html

https://blog.csdn.net/qq_16885135/article/details/54427532

转载于:https://www.cnblogs.com/tangxuliang/p/10900636.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值