ウェブカメラに接続してソケットから読み取り、印刷機能を使用してこのデータを出力する簡単なリレースクリプトを作成しました。データは、境界が設定されたMJPGデータです。読み取ったデータを出力するだけです。
問題は、PHPがこのデータをバッファリングしているように見えることです。カメラを1FPSに設定すると、フィードが7〜8秒間フリーズし、すぐに8フレームが表示されます。解像度を巨大なサイズに設定すると、カメラはほぼ1秒あたり1フレームで移動します。その場合、何らかのバッファリングが発生していると思います(巨大なサイズはバッファをすぐにいっぱいにし、小さなサイズはそうではないため)、このバッファリングを無効にする方法がわかりません。誰かがその方法を知っていますか?
コード:
ignore_user_abort(false);
$boundary = "myboundary";
//Set this so PHP doesn't timeout during a long stream
set_time_limit(0);
$socketConn = @fsockopen ("192.168.1.6", 1989, $errno, $errstr, 2);
if (!$socketConn)
exit();
stream_set_timeout($socketConn, 10);
fputs ($socketConn, "GET /mjpeg HTTP/1.0\r\n\r\n");
//Setup Header Information
header("Cache-Control: no-cache");
header("Cache-Control: private");
header("Pragma: no-cache");
header("Content-type: multipart/x-mixed-replace; boundary=$boundary");
@ini_set('implicit_flush', 1);
for ($i = 0; $i < ob_get_level(); $i++)
ob_end_flush();
ob_implicit_flush(1);
stream_set_blocking($f2, false);
//Send data to client
while (connection_status() == CONNECTION_NORMAL)
{
$chunk = fread($socketConn, 128);
print $chunk;
}
fclose($socketConn);