2015-05-01 66 views
0

我正在使用其他答案的一些代碼通過http流式傳輸音頻 - 但不知道'chunksize'會是最好的...這些文件可能非常大,並且流式傳輸到網頁上的音頻標籤,我想快速啓動...文件主要是.w3和.mp3「流式傳輸」音頻文件的「塊大小」是什麼?

function streamfile($filename, $retbytes = TRUE) { 
    $CHUNK_SIZE = 1024*1024; // Size (in bytes) of tiles chunk 
    $buffer = ''; 
    $cnt =0; 
    // $handle = fopen($filename, 'rb'); 
    $handle = fopen($filename, 'rb'); 
    if ($handle === false) { 
     return false; 
    } 
    while (!feof($handle)) { 
     $buffer = fread($handle, $CHUNK_SIZE); 
     echo $buffer; 
     ob_flush(); 
     flush(); 
     if ($retbytes) { 
      $cnt += strlen($buffer); 
     } 
    } 
    $status = fclose($handle); 
    if ($retbytes && $status) { 
     return $cnt; // return num. bytes delivered like readfile() does. 
    } 
    return $status; 
} 
+0

我覺得http://stackoverflow.com/questions/15540725/optimal-buffer-size-for-read-過程寫將幫助你 –

+0

乾杯這是一個普遍的,我也發現了這個... http://stackoverflow.com/questions/2398406/ideal-chunk-size-for-writing-streamed-content-to-disk -on-iphone - 但看起來像我的服務器根本不流媒體(!) – pperrin

回答

0

所有的建議似乎是'吸它,看'!

我嘗試了一系列從1k到1024k的尺寸獲得各種結果,但沒有什麼了不起的。

我也嘗試過使用可變塊大小 - 快速獲得一些樂曲以便播放曲目並使用該時間發送更大的音樂塊 - 但它又是試驗和錯誤。

我也不得不通過各種設置來停止PHP /網絡服務器等'有用'做自己的緩存!

我現在已經定居在512k上......看起來和任何(!)一樣好。

希望這可以幫助別人!

0

在Linux系統上,如果您使用命令strace來監視系統活動,您很快會發現腳本的侷限性在哪裏。
例如,監視curl的性能請求您可能會發現帶寬是限制因子。
它可能顯示例如:

socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 41 
fcntl(41, F_GETFL)      = 0x2 (flags O_RDWR) 
fcntl(41, F_SETFL, O_RDWR|O_NONBLOCK) = 0 
connect(41, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("<some.ip>")}, 16) = -1 EINPROGRESS (Operation now in progress) 
sendto(41, "GET /some-service/some"..., 3480, MSG_NOSIGNAL, NULL, 0) = 3480 
recvfrom(41, "HTTP/1.1 200 OK\r\nTransaction-Id:"..., 16384, 0, NULL, NULL) = 14720 
recvfrom(41, "\332\347\330Y\271\263F\314\7\225\271\264[16b\336_\346B[\n\350\336\210\371\10\371\226\373:\363"..., 16384, 0, NULL, NULL) = 16384 
recvfrom(41, "\255W\[email protected]\10\325\365A<\26\1\4\\\246\252\347\350\17\346kH\250\\&`BU\337\352\346m\225"..., 16384, 0, NULL, NULL) = 12223 
close(41)        = 0 

在這個例子中,你看到你收到的14,16和12 KB 3級封裝,默認的16kB的上限。 由於帶寬限制,第一個軟件包未被填充,因此不允許在所需的讀取時間限制內填充內部緩衝區。 如果你想改變PHP引擎的內部塊限制,你可以做到這一點:

$handle = fopen($filename, 'rb'); 
stream_set_chunk_size($handle, $CHUNK_SIZE); 
stream_set_read_buffer($handle, $CHUNK_SIZE);