Comment diffuser http mjpg sur https en utilisant le proxy php
P粉835428659
2023-09-03 20:54:13
<p>J'ai ce script php qui est censé charger un flux mjpg via HTTP et le sortir via HTTPS. Cependant, tout ce qu'il produit est une image brisée : </p>
<pre class="brush:php;toolbar:false;"><?php
fonction proxyMjpegStream($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 8192);
header("Content-Type: multipart/x-mixed-replace; border=myboundary");
curl_exec($ch);
curl_close($ch);
}
// Récupère l'URL du flux MJPEG vers le proxy
if (isset($_GET['url'])) {
$mjpegUrl = $_GET['url'];
// Valide que l'URL est une source HTTP valide
if (filter_var($mjpegUrl, FILTER_VALIDATE_URL) && strpos($mjpegUrl, 'http://') === 0) {
proxyMjpegStream($mjpegUrl);
sortie;
}
}
// Paramètre URL MJPEG invalide ou manquant
en-tête ("HTTP/1.0 400 Requêtes incorrectes");
echo "URL MJPEG invalide";
?></pre></p>
Ce n'est pas vraiment la réponse à la question, Anas en a déjà parlé, mais cela mérite quand même la peine d'être mentionné et n'est pas approprié dans les commentaires.
Vous aurez du mal à écrire des blocs de code comme celui-ci :
Si vous continuez à reporter les conditions d'erreur jusqu'à la fin et à inclure des conditions de non-erreur dans un bloc
if(){}
, vous rencontrerez deux problèmes.if(){}
blocs imbriqués, connus sous le nom d'« anti-motif de flèche ».Après quelques recherches, vous pouvez utiliser la fonction suivante pour exécuter un stream en curl :
Et créez la fonction de rappel :
Votre code fonctionne bien mais après 30 secondes votre stream se terminera car vous l'avez défini
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
Ma recommandation pour les URL de streaming est d'utiliser
fopen()
car cURL est principalement conçu pour faire des requêtes HTTP afin d'obtenir du contenu statique. Les flux MJPEG sont dynamiques et de nouvelles trames sont envoyées en continu.Par défaut, cURL définit un délai d'attente pour chaque requête. Si le serveur met beaucoup de temps à envoyer des trames, la requête peut expirer, entraînant une interruption du flux ou un message d'erreur.
Vous pouvez utiliser la fonction
fopen()
pour obtenir la meilleure expérience. Voici un exemple utilisant streams et fopen.