Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk menstrim http mjpg melalui https menggunakan proksi php

<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粉835428659P粉835428659435 hari yang lalu508

membalas semua(2)saya akan balas

  • P粉588152636

    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.

    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.

    balas
    0
  • P粉523625080

    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);
    }
    ?>

    balas
    0
  • Batalbalas