2011-11-25 40 views
0

我使用VCL廣播到我的本地主機,127.0.0.1與UDP(傳統)方法。爲了趕上交通,我用這個代碼:接收VLC生成的MP4與PhP有點雜亂

$address = '127.0.0.1'; 
$port = 1234; 
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
socket_bind($sock, $address, $port) or die('Could not bind to address'); 
$f = fopen ('output', 'w'); 
fclose ($f); 
$sock = stream_socket_server('udp://127.0.0.1:1234', $errno, $errstr, STREAM_SERVER_BIND); 
while(1) 
{ 
    $a = stream_socket_recvfrom($sock, 65536); 
    $f = fopen('output', 'a'); 
    fwrite ($f, $a); 
    fclose ($f); 
    @ob_flush(); 
} 

這會將數據包並保存,我把它重命名爲.MP4​​和開放 - 好,結果是有點混亂。我可以識別輸出,頂部屏幕可見,下部不好。我試圖用另一個VCL播放器捕獲它,並沒有問題。

+1

UDP不保證您接收數據包的順序。這些軟件包的發送順序可能與發送順序不同。這可能是問題的原因? – chhenni

+0

好吧,我指望它,但正如我所說,另一個VCL播放器正確地重播了這個流。小錯誤不是一個問題,但它使它變得不受歡迎... –

+2

爲什麼每次循環迭代時都會'fopen()'和'fclose()'文件指針?這是非常低效的。 – FtDRbwLXw6

回答

2

這是你的代碼,刪除了很多無用的東西,並提高了一些效率。試試看看會發生什麼。它可能會或可能不會解決問題,但會報告發生的情況,然後我們會從中取出。

// Settings 
$address = '127.0.0.1'; 
$port = 1234; 
$outfile = "output.mp4"; 

// Open pointers 
if (!$ofp = fopen($outfile, 'w')) 
    exit("Could not open output file for writing"); 
if (!$ifp = stream_socket_server("udp://$address:$port", $errno, $errstr, STREAM_SERVER_BIND)) 
    exit("Could not create listen socket ($errno: $errstr)"); 

// Loop and fetch data 
// This method of looping is flawed and will cause problems because you are using 
// UDP. The socket will never be "closed", so the loop will never exit. But you 
// were looping infinitely before, so this is no different - we can address this 
// later 
while (!feof($ifp)) { 
    if (!strlen($chunk = fread($ifp, 8192))) continue; 
    fwrite($ofp, $chunk); 
} 

// Close file pointers 
fclose($ofp); 
@fclose($ifp); 
+0

好吧,那個產生更好的產出。我想問題在於編碼,因爲即使一個字節是異常的,整個視頻也會損壞。我嘗試過其他編碼,而且像素錯誤較少但數量可怕:P –