Bagaimana untuk menstrim http mjpg melalui https menggunakan proksi php
P粉835428659
P粉835428659 2023-09-03 20:54:13
0
2
524
<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>
P粉835428659
P粉835428659

membalas semua(2)
P粉588152636

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.

  1. Syarat yang mencetuskan ralat semakin terputus dari mana mesej ralat dijana.
  2. Kod "laluan menuju kebahagiaan" anda terkubur lebih dalam dan lebih dalam dalam blok 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粉523625080

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);
}
?>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan