Bagaimana untuk menstrim http mjpg melalui https menggunakan proksi php
P粉835428659
2023-09-03 20:54:13
<p>Saya mempunyai skrip php ini yang sepatutnya memuatkan aliran mjpg melalui HTTP dan output melalui HTTPS. Walau bagaimanapun, semua yang dihasilkannya hanyalah imej yang rosak: </p>
<pre class="brush:php;toolbar:false;"><?php
fungsi proxyMjpegStream($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, benar);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, palsu);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, palsu);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 8192);
header("Jenis Kandungan: multipart/x-mixed-replace; boundary=myboundary");
curl_exec($ch);
curl_close($ch);
}
// Dapatkan URL strim MJPEG kepada proksi
if (isset($_GET['url'])) {
$mjpegUrl = $_GET['url'];
// Sahkan bahawa URL ialah sumber HTTP yang sah
if (filter_var($mjpegUrl, FILTER_VALIDATE_URL) && strpos($mjpegUrl, 'http://') === 0) {
proxyMjpegStream($mjpegUrl);
keluar;
}
}
// Parameter URL MJPEG tidak sah atau tiada
pengepala("HTTP/1.0 400 Permintaan Buruk");
bergema "URL MJPEG tidak sah";
?></pra></p>
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:
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:
Kepada:
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.
Selepas beberapa penyelidikan, anda boleh menggunakan fungsi berikut untuk melaksanakan aliran dalam curl:
Dan buat fungsi panggil balik:
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.