Rumah > Soal Jawab > teks badan
P粉5881526362023-09-04 15:45:35
Ini sebenarnya bukan jawapan kepada soalan itu, Anas sudah mengupas perkara ini, tetapi ia patut disebut juga dan tidak sesuai dalam komen.
Anda akan menghadapi masalah menulis blok kod seperti ini:
// Get the URL of the MJPEG stream to proxy
if (isset($_GET['url'])) {
$mjpegUrl = $_GET['url'];
// Validate that the URL is a valid HTTP source
if (filter_var($mjpegUrl, FILTER_VALIDATE_URL) && strpos($mjpegUrl, 'http://') === 0) {
proxyMjpegStream($mjpegUrl);
exit;
}
}
// Invalid or missing MJPEG URL parameter
header("HTTP/1.0 400 Bad Request");
echo "Invalid MJPEG URL";
Jika anda terus menangguhkan syarat ralat hingga akhir dan memasukkan syarat bukan ralat dalam blok if(){}
, anda akan menghadapi dua masalah.
if(){}
bersarang, dikenali sebagai anti-corak anak panah. Anda boleh memformat semula:
if( good ) { if( also good ) { do_thing(); exit(); } else { raise_error('also bad'); } } raise_error('bad');
Kepada:
if( ! good ) { raise_error('bad'); } if( ! also good ) { raise_error('also bad'); } do_thing();
Ini bukan peraturan yang keras dan pantas, tetapi mengingatinya boleh membantu mengelakkan daripada menulis blok kod yang terputus-putus atau mengelirukan, atau blok kod yang akhirnya meluas ke sebelah kanan halaman.
P粉5236250802023-09-04 09:43:59
Selepas beberapa penyelidikan, anda boleh menggunakan fungsi berikut untuk melaksanakan aliran dalam curl:
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'streamCallback');
Dan buat fungsi panggil balik:
function streamCallback($curl, $data) { // Process the received data echo $data; // Return the length of the data processed return strlen($data); }
Kod anda berfungsi dengan baik tetapi selepas 30 saat strim anda akan tamat kerana anda menetapkan curl_setopt($ch, CURLOPT_TIMEOUT, 30);
Syor saya untuk URL penstriman ialah menggunakan fopen()
kerana cURL direka terutamanya untuk membuat permintaan HTTP untuk mendapatkan kandungan statik. Strim MJPEG adalah dinamik dan bingkai baharu dihantar secara berterusan.
Secara lalai, cURL menetapkan tamat masa untuk setiap permintaan. Jika pelayan mengambil masa yang lama untuk menghantar bingkai, permintaan itu mungkin tamat masa, mengakibatkan gangguan dalam strim atau mesej ralat.
Anda boleh menggunakan fungsi fopen()
untuk mendapatkan pengalaman terbaik.
Berikut ialah contoh menggunakan aliran dan fopen.
<?php $videoUrl = 'http://74.142.49.38:8000/axis-cgi/mjpg/video.cgi'; // Set the appropriate headers for MJPG header('Content-Type: multipart/x-mixed-replace; boundary=myboundary'); // Continuously fetch and display frames while (true) { // Open a connection to the video stream $stream = fopen($videoUrl, 'rb'); // Check if the stream is valid if (!$stream) { die('Error opening stream'); } // Read and display each frame while ($frame = fread($stream, 4096)) { // Display the frame echo $frame; // Flush the output buffer ob_flush(); flush(); } // Close the stream fclose($stream); } ?>