Конференция "Сети" » Чем разделить видеопоток? [D7, WinXP]
 
  • ABolnykh © (22.10.09 11:36) [40]
    DVM, огромное Вам спасибо за полезные советы!
    Специалист ТАКОГО уровня в тяжкую и голодную годину без персонального бутерброда с красной икрой уж точно не останется!

    Но собственную шишку нужно набивать самостоятельно, отрицательный опыт - это тоже опыт, хотя бы для того, чтобы в будущем знать, как не надо делать, и потому желательно все плюсы и минусы увидеть своими глазами.

    Поэтому, прикинув мышь к носу, я для начала решил избрать следующую последовательность действий:
    1. Запрашиваю от камеры 1 кадр видеопотока по HTTP;
    2. Копирую его в буфер.
    3. Мультикастю буфер процедурой SendBuffer MCast-сервера на групповой адрес 224.0.0.1, порт 10500.
    4. Даю задержку на 100 мс.
    5. Перехожу на шаг 1.

    Какой-то поток от меня начинает исходить, я вижу его трафик в окошке DUMeter-а.

    Теперь очередной идиотский вопрос: как мне этот поток принять и отобразить? Если в строке адреса Internet Explorer-а я ввожу
    udp://224.0.0.1:10500
    то неизменно получаю "The page cannot be displayed".
    Если пытаюсь поймать поток ВидеоГраббером, устанавливая его свойство
    IpCameraUrl на тот же групповой адрес и порт, то тоже не получаю никакой картинки.  :-(

    Кстати, Вам приходилось иметь дело с компонентом TVideoGrabber (www.datastead.com)? Можете сказать про него что-нибудь хорошего или плохого?
  • Сергей М. © (22.10.09 11:52) [41]

    > ввожу
    > udp://224.0.0.1:10500
    > получаю "The page cannot be displayed".


    Браузер понятия не имеет что делать с поступающими оттуда данными, ибо udp не является протоколом прикладногго уровня.

    VideoGrabber тоже понятия не имеет, но пытается интерпретировать их в соответствии известными ему прикладными потоковыми протоколами. Соответствия не обнаруживает, потому и не рисует картинку.
  • ABolnykh © (22.10.09 12:44) [42]

    > Сергей М. ©   (22.10.09 11:52) [41]
    >
    > Браузер понятия не имеет что делать с поступающими оттуда данными, ибо udp не является протоколом прикладногго уровня.

    Похоже, что так. :-(

    Так чего делать-то, как жить дальше? Есть какой-нибудь способ отобразить смультикасченные данные?
  • Сергей М. © (22.10.09 12:49) [43]
    Для этого каст-сервер и каст-клиент должны взаимодействовать по единому известному обоим прикладному потоковому протоколу.
    А что у тебя за протокол используется  - ты и сам поди не знаешь)
  • Сергей М. © (22.10.09 12:58) [44]
    Для передачи потокового видео используются ряд сетевых протоколов, из которых важнейшими являются протокол RTSP и протокол IGMP.

    RTSP (Real-Time Streaming Protocol) - это протокол, с возможностью контролируемой передачи видео-потока в интернете. Протокол обеспечивает пересылку информации в виде пакетов между сервером и клиентом. При этом получатель может одновременно воспроизводить первый пакет данных, декодировать второй и получать третий.

    Протокол из этой же группы RTP (Real-time transport protocol) определяет и компенсирует потерянные пакеты, обеспечивает безопасность передачи контента и распознавание информации. Вместе с RTP работает протокол RTCP (Real-Time Control Protocol). Он отвечает за проверку идентичности отправленных и полученных пакетов, идентифицирует отправителя и контролирует загруженность сети.

    Для присоединения к сети или выхода из группы рассылки используется стандартный протокол IGMP (Internet Group Membership Protocol).
  • DVM © (22.10.09 13:09) [45]

    > ABolnykh ©   (22.10.09 11:36) [40]


    > DVM, огромное Вам спасибо за полезные советы!

    Не за что.


    > Кстати, Вам приходилось иметь дело с компонентом TVideoGrabber

    Давным давно, когда он был вроде бесплатный и с исходниками даже чуть-чуть я его изучал, в частности смотрел как там был сделан детектор движения (точнее активности, не знаю остался ли он там), мне не понравилось, ибо было медленно и на этом мое с ним знакомство закончилось.


    > Так чего делать-то, как жить дальше?

    Если хочешь транслировать через UDP, да еще мультикастом, то тебе придется либо изобретать свой протокол, либо обратить свой взор на связку RTSP/RTP/RTCP.

    А чтобы смотреть это дело через браузер, надо для браузера писать либо JavaApplet, либо FlashPlayer, либо QuickTime, либо ActiveX компонент (только для IE) или Silverlight компонент, который будет принимать поток в нужном формате. Сам браузер ясное дело не умеет.

    Из браузеров только FireFox умеет принимать и показывать  MJPEG over HTTP без всяких дополнений.

    Я тебе потому и советую безо всяких мультикастов и UDP для начала обойтись. Это проще в реализации как на сервере так и на клиенте.
  • DVM © (22.10.09 13:21) [46]

    > ABolnykh ©

    Ты научился получать отдельные кадры.
    Теперь научи TIDHTTPServer отдавать эти отдельные кадры по запросу, не надо пока формировать MJPEG поток.
    И все уже будет работоспособно более-менее. И смотреть тогда можно в браузере с пом например такого кода:


    <html>
     <head>
       <title>JavaScript</title>
       <meta http-equiv=Content-Type content="text/html;charset=windows-1251">

       <script language="javascript" type="text/javascript">

         var ch=1;  
         errorimg = 0;

         function LoadImage() {
           uniq = Math.random();
           document.images.webcam1.src = "http://127.0.0.1:80/jpeg.cgi?channel=" + ch + "&uniq=" + uniq;
           document.images.webcam1.onload = DoIt;
         }


         function ErrorImage() {
           errorimg++;
           if (errorimg > 3) {
             document.images.webcam1.onload = "";
             document.images.webcam1.onerror = "";
             document.images.webcam1.src = "http://127.0.0.1:80/images/failure.gif";
           }
    else {
             uniq = Math.random();
           document.images.webcam1.src = "http://127.0.0.1:80/jpeg.cgi?channel=" + ch + "&uniq=" + uniq;
           }

         }
     
         function DoIt()
         {
           errorimg = 0;
           window.setTimeout("LoadImage();", 40);
         }

     
       </script>  

     </head>
     <body onload="DoIt()">
       <center>
       <h2>Просмотр видео (JavaScript)</h2>
       <img src="http://127.0.0.1:80/images/failure.gif" class="webcam1_class" id="webcam1" />
       </center>
     </body>
    </html>




    Получится подобие видео.
  • DVM © (22.10.09 13:23) [47]
    В коде выше /jpeg.cgi это виртуальный путь, по которому вебсервер должен понять что от него хотят картинку, а параметр channel - определяет с какой камеры картинку.
 
Конференция "Сети" » Чем разделить видеопоток? [D7, WinXP]
Есть новые Нет новых   [134438   +31][b:0.001][p:0.002]