2012-02-08 69 views
0

我需要通過此php文件從另一臺服務器流式傳輸媒體文件。如何解決這個標題爲流?

<?php 
$out = array(
    'http'=>array(
    'method'=>"GET", 
    'header'=>"Content-type: audio/mpeg\r\n", 
) 
); 

$stream = stream_context_create($out); 

$end = fopen('http://example.com/audio.mp3', 'r', false, $stream); 
fpassthru($end); 
readfile($end); 
?> 

但是標題不起作用。 我該如何解決這個問題?

+0

? – djot 2012-02-08 10:10:38

回答

0

您正在以錯誤的方向發送標題。你所做的是通知源服務器,你將在GET請求中發送一些audio/mpeg - 無論如何這是無效的,GET請求沒有內容。您實際需要做的是將其發送給將要接收內容的客戶端。

你應該不需要流上下文完成這個任務 - 試試這個代碼:

<?php 

    // Try and open the remote stream 
    if (!$stream = fopen('http://example.com/audio.mp3', 'r')) { 
    // If opening failed, inform the client we have no content 
    header('HTTP/1.1 500 Internal Server Error'); 
    exit('Unable to open remote stream'); 
    } 

    // It's probably an idea to remove the execution time limit - on Windows hosts 
    // this could result in the audio stream cutting off mid-flow 
    set_time_limit(0); 

    // Inform the client we will be sending it some MPEG audio 
    header('Content-Type: audio/mpeg'); 

    // Send the data 
    fpassthru($stream); 
+0

不錯的解決方案!但在iOS(5.0.1)中,即使使用mp3 128kbps,流式傳輸也有點慢。任何想法爲什麼? PD:我從更快的VPS流式傳輸。 – ignaces 2012-02-08 12:05:17

+0

你如何測試?通過移動網絡或WiFi?請記住,您受限於客戶端和遠程服務器之間傳輸鏈中最慢的鏈接。因此,如果客戶端的互聯網連接不能支持128kbps +數據包開銷,它將無法工作。同樣,如果您的服務器遇到帶寬問題,它也將無法工作,原始源服務器也是如此。由於您同時從源服務器下載數據並將其上載到客戶端,因此您的服務器將需要每個併發流對稱的128k +數據包開銷。 – DaveRandom 2012-02-08 12:50:48

+0

這是實時媒體流協議通常使用UDP的一個主要原因。由於其固有的有損性質,這在無線連接上不太可行,但它大大降低了開銷,應儘可能地實施。由於丟包亂序到達,UDP流更容易出現小錯誤,但是TCP流可能會導致重傳,這將增加所需的帶寬以及延續數據流的等待時間。 – DaveRandom 2012-02-08 12:54:21

0

的fopen後,加入

是內容長度也需要
header('content-type: audio/mpeg'); 
or 
header('content-type: application/octet-stream'); 
+0

第二個示例通常會強制瀏覽器下載。 – Narf 2012-11-13 14:04:25