2016-11-21 161 views
1

我通过第三方API加载视频。
它返回正文中的二进制数,并带有Transfer-Encoding :chunked标题。如何将浏览器的流氓响应流式传输到浏览器?

我使用Guzzle 4来消费api,我怎样才能轻松地将它传输到浏览器,所以我不需要首先将整个东西加载到内存中?

我不想将它设置为attachment,因为我希望它在浏览器中播放而不是下载。

<?php 

$client = new GuzzleHttp\Client(); 

// Download the video and stream it to the client 
$response = $client->get($url)->send(); 

//But this will have to cache the whole thing in PHP memory first... 
header("Content-Type:{$response->getHeader('Content-Type')}"); 
echo $response->getBody(); 
+0

除了Guzzle,你知道还有什么是HTTP客户端吗?用户的浏览器。为什么不让它直接消费视频? – Chris

+2

由于内容位于我们的应用程序(而非用户)身份验证的私有API的后面。我基本上需要通过浏览器代理视频请求,通过我们的应用程序执行auth和其他一些事情,然后将视频返回给消费客户端。如果第三方API提供了像S3这样的预先认证的URL,那么我可以将任何请求重定向到该网址,但我拥有的就是这个流,而我无法看到一种简单的代理方式... –

回答

0

我假设你想在视频播放器上在你的网站上显示视频。如果是这种情况,请转至http://docs.videojs.com/docs/guides/setup.html。但是,由此,用户在观看视频之前还必须先下载整个视频。如果你想要的是一个可以像YouTube一样通过块传输块的视频,它比这更复杂,我不相信你可以在PHP中做到这一点。您可以学习Node.js,Ruby或Python,或者只是使用视频即服务网站来为您做像vimeo或http://vzaar.com

0

如果别人在看这...

狂饮4响应不是默认流(他们是在最新的版本),你必须启用在请求选项..

['stream'=>true] 

然后使用Stream UTIL读取数据流的每一行..

GuzzleHttp\Stream\Utils::readline 

所以....

<?php 

$client = new GuzzleHttp\Client(); 

// Download the video as a stream 
$response = $client->request('GET', $url, ['stream'=>true])->send(); 

//$body is now a Guzzle stream object. 
$body = $response->getBody(); 

header("Content-Type:{$response->getHeader('Content-Type')}"); 

while (!$body->eof()) { 
    echo GuzzleHttp\Stream\Utils::readline($body); 
    ob_flush(); 
    flush(); 
} 
相关问题