2016-11-21 155 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(); 
} 
相關問題