none
Реализация потоковой передачи видео по сети (WCF) RRS feed

  • Вопрос

  • Немного воды...

    Работаю с распознаванием лиц для диплома. Хочется поближе познакомиться с технологией WCF.

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

    Для своих целей при обработки  я буду использовать Emgu (Net обертка над openCV).

    Суть:

    И самое простое что пришло в голову - это передавать видео по кадрам - как раз удобно - можно будет принимать и сразу обрабатывать

    Но хотелось бы узнать как это люди реализуют это по другому, best practies так сказать. Возможна ли передача потоком (я нашел такую в Silverlite - Smooth Streaming)

    29 марта 2012 г. 19:08

Ответы

  • > Возможна ли передача потоком


    см. WCF Потоковая передача сообщений
     
     
    • Помечено в качестве ответа vvkuznetsov 30 марта 2012 г. 23:28
    30 марта 2012 г. 12:38
  • Здравствуйте.

    Да скорей всего также и передают видео по фреймам (т.е. кадрам), сам фреймы скорей всего сжаты каким-либо кодеком, чтобы объем их был меньше. А вся передача данных идет общим потоком, из которого, например, по специальным разделителям выделяются кадры. Smooth Streaming заключается в том, что качество картинки динамически адаптируется под пропусную способность вашего канала связи.

    Вот пример как происходит захват видео с веб камеры - Versatile WebCam C# library


    Для связи [mail]

    • Помечено в качестве ответа vvkuznetsov 30 марта 2012 г. 23:28
    30 марта 2012 г. 8:49
    Модератор

Все ответы

  • Здравствуйте.

    Да скорей всего также и передают видео по фреймам (т.е. кадрам), сам фреймы скорей всего сжаты каким-либо кодеком, чтобы объем их был меньше. А вся передача данных идет общим потоком, из которого, например, по специальным разделителям выделяются кадры. Smooth Streaming заключается в том, что качество картинки динамически адаптируется под пропусную способность вашего канала связи.

    Вот пример как происходит захват видео с веб камеры - Versatile WebCam C# library


    Для связи [mail]

    • Помечено в качестве ответа vvkuznetsov 30 марта 2012 г. 23:28
    30 марта 2012 г. 8:49
    Модератор
  • > Возможна ли передача потоком


    см. WCF Потоковая передача сообщений
     
     
    • Помечено в качестве ответа vvkuznetsov 30 марта 2012 г. 23:28
    30 марта 2012 г. 12:38
  • > Возможна ли передача потоком


    см. WCF Потоковая передача сообщений
     
     

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

    Пример приведу на попытке создания WCF приложения (пробовал и для WCF приложения потока данных) либо в Тестовом клиенте WCF или в другом проекте добавляем ссылку на эту службу, и в уже сгенерированном файлике app.config увидеть что transferMode="Buffered"

    и я постарался задокументировать все что я делал

    и ссылка на тестовый проект (WcfStreamTest) https://skydrive.live.com/?cid=3302bd30fa4d7d41#cid=3302BD30FA4D7D41&id=3302BD30FA4D7D41%21107

    несложный код (делал по http://msdn.microsoft.com/ru-ru/library/ms789010.aspx )

    [ServiceContract]
    public interface IVideoTransfer
    {
        [OperationContract]
        bool SetData(Stream stream);
    }
    
    public class VideoTransfer : IVideoTransfer
    {
        public bool SetData(Stream stream)
        {
            throw new NotImplementedException();
        }
    }

    и файл Web.config

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    
      <system.web>
    	<compilation debug="true" targetFramework="4.0" />
      </system.web>
      <system.serviceModel>
    	  
    	  <bindings>
    		  <basicHttpBinding>
    			  <binding name="BasicHttpBinding_IVideoTransfer"
    					   transferMode="Streamed"
    					   maxReceivedMessageSize="67108864">
    			  </binding>
    		  </basicHttpBinding>
    	  </bindings>
    	  
    	<behaviors>
    	  <serviceBehaviors>
    		<behavior>
    		  <!-- Чтобы избежать раскрытия сведений о метаданных, присвойте приведенному ниже параметру значение false и удалите конечную точку метаданных перед развертыванием -->
    		  <serviceMetadata httpGetEnabled="true"/>
    		  <!-- Чтобы при сбое получать подробные сведения об исключении для целей отладки, установите для нижеприведенного параметра значение true.  Перед развертыванием установите значение false, чтобы избежать раскрытия информации об исключении -->
    		  <serviceDebug includeExceptionDetailInFaults="false"/>
    		</behavior>
    	  </serviceBehaviors>
    	</behaviors>
    	<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
      </system.serviceModel>
     <system.webServer>
    	<modules runAllManagedModulesForAllRequests="true"/>
      </system.webServer>
      
    </configuration>


    в итоге мы получаем либо

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="BasicHttpBinding_IVideoTransfer" closeTimeout="00:01:00"
                        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                        useDefaultWebProxy="true">
                        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                        <security mode="None">
                            <transport clientCredentialType="None" proxyCredentialType="None"
                                realm="" />
                            <message clientCredentialType="UserName" algorithmSuite="Default" />
                        </security>
                    </binding>
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://localhost:63618/IVideoTransfer.svc"
                    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IVideoTransfer"
                    contract="ServiceReference1.IVideoTransfer" name="BasicHttpBinding_IVideoTransfer" />
            </client>
        </system.serviceModel>
    </configuration>

    либо можно еще посмотреть вот в таком виде

    http://www.c-sharpcorner.com/uploadfile/afenster/wcf-streaming-large-data-files/  - тут тоже самое, только указаны немного другие настройки в Web.config

    В общем я абсолютно не понимаю что я делаю не так.


    • Изменено vvkuznetsov 31 марта 2012 г. 1:10 Добавил ссылку на исходный проект
    31 марта 2012 г. 0:23
  • В принципе, можно даже забыть об этом - мне только сейчас в голову пришло, что я абсолютно не понимаю что бы я делал, если бы организовал потоковую передачу... Ее в конце концов можно руками написать. Но что делать с этими байтами - это же не набор картинок, я еще не знаю как с этим работать. Так что я думаю остановлюсь на первом варианте.

    Но если кто-то хочет мне предложить - рад буду выслушать.

    И да, хотелось бы понять в чем причина бага, описанного выше.

    31 марта 2012 г. 0:49
  • я нашел хороший пример, где по сети передаются файлы в потоковом режиме.. но там описание wcf сервиса и его запуск происходит полностью в ручном режиме,  - так что разобраться в случившемся это не помогает :(

    http://www.abhisheksur.com/2010/09/progress-streamed-file-download-and.html


    http://msdn.microsoft.com/en-us/library/aa717050.aspx

    • Изменено vvkuznetsov 31 марта 2012 г. 2:43 нашел еще один пример
    31 марта 2012 г. 1:30
  • > пытаясь сделать потоковую передачу, я столкнулся с проблемой, что у меня не получается правильно настроить сервис
     
     
    см. Streaming over HTTP with WCF (есть пример)
     
     
    31 марта 2012 г. 9:48