2013-02-18 3 views
2

저는 C# 코드에서 30FPS의 비디오 프레임을 가지고 있으며 다른 모든 응용 프로그램에서 사용할 수 있도록 로컬 호스트에서 브로드 캐스팅하려고합니다. 나는 비디오이기 때문에 어떤 패킷 손실 및 클라이언트에서 연결/받아 들일 필요가 없다면 걱정할 필요가 없다. UDP는 좋은 선택이다.소켓을 통한 비디오 전송 프레임

하지만 여기에는 많은 문제가 있습니다.

  • 나는 UDP 유니 캐스트 속도 (CPU 사용이 적합하지 않습니다 내 4 코어 CPU에 하나 개의 스레드에 100 %를 평균 25 % 이다. 그러나 적어도 그것의 충분한 세트를 보내 초당 25에 대해, 충분히 사용하는 경우 데이터). 그러나 유니 캐스트 캔트는 모든 클라이언트에 데이터 을 전달합니다.
  • 브로드 캐스트 속도를 사용하는 경우 매우 낮습니다. 동일한 CPU 사용으로 약 10FPS.

어떻게해야합니까?! 데이터는 동일한 컴퓨터에 있으므로 LAN이나 기타 등에서 원격 액세스 할 필요가 없습니다. 단지 동일한 기계의 서로 다른 애플리케이션간에 초당 약 30MB의 데이터를 전송하는 방법이 필요합니다. (640x480은 픽셀 당 이미지 x 30fps x 3byte의 고정 크기가 약 27000KByte/초입니다.)

  1. UDP 멀티 캐스트의 성능은 더 좋습니까?
  2. 각 클라이언트를 수락하더라도 TCP가 더 나은 성능을 제공 할 수 있습니까? 및 독자적으로 보낼 수 있습니까?!
  3. 소켓보다 더 좋은 방법이 있습니까?! 메모리 공유 또는 뭔가?!
  4. 왜 UDP 방송이 그렇게 느린가요?! 초당 약 10MB!?
  5. 고성능 프레임을 압축하는 빠른 방법이 있습니까 ( 초 30fps 인코딩 및 다른 부분의 디코딩)? 클라이언트 응용 프로그램은 C++에 있으므로 크로스 플랫폼 방식이어야합니다.

여기서는 다른 개발자의 경험과 아이디어를 알고 싶습니다. 생각해보십시오. 도움 주셔서 감사합니다.

편집 : 데이터에 대한

상세 정보 : 데이터 비트 맵 RGB24 형식으로되어 그들이 30FPS 내 응용 프로그램에 장치에서 스트리밍된다. 이 데이터를 다른 응용 프로그램에 브로드 캐스팅하고이 이미지를 RGB24 형식으로 다시 가져와야합니다. 어떤 헤더 나 어떤 것이 없으며 고정 된 크기의 비트 맵 데이터 만 존재합니다. 모든 작업은 즉시 수행해야합니다. 손실 압축 알고리즘이나 어떤 것을 사용 하든지 관계 없습니다.

+0

어떤 이유로 많은 기존의 스트리밍 비디오 프로토콜 중 하나 적합하고 많은 비디오 스트리밍 솔루션 중 하나를 사용하여 왜 작동하지 않습니다이 있습니까 : 여기

는 파일 매핑으로 시작하는 샘플입니다? 이것은 여러 가지 다른 방법으로 해결 된 문제입니다. 분명히 그러한 방법 중 하나가 당신의 필요를 충족시켜야하며 바퀴를 다시 발명 할 필요가 없습니다. – Pete

+0

@ Pete, UDP 기반의 크로스 플랫폼 (.Net, C++) 비디오 스트리밍 라이브러리를 아십니까? 불행하게도 나는 그것을 발견 할 수 없다. 라이브러리없이 이러한 프로토콜 중 하나를 구현하는 것이 전체 솔루션을 발명하는 것이 쉽지 않기 때문에. –

+0

FFMPEG 체크 아웃 – Pete

답변

2

산업용 환경에서 멀티 캐스트를 실험 했으므로 안정성이 보장되지 않는 네트워크상에서 을 선택하는 것이 좋습니다. 당신이 프레임의 순환 큐를 구축하고 포인터 만 할당을 보호하기 위해 하나의 뮤텍스와 다음 하나에서 플립 수 있기 때문에

로컬 호스트, 공유 메모리에서가 좋은 선택이 될 수 있습니다 (writter 측). 한 명의 작가, 여러 독자가 있어도 문제는 발생하지 않습니다.

C++ C#을 사용하는 공유 메모리는 파일 매핑이라고 부르지 만 시스템 페이징 파일 (RAM 및/또는 디스크)을 사용할 수 있습니다. How to implement shared memory in .NET?

  • Fully managed shared memory .NET implementations?
  • 공유 메모리 공간을 보호하거나 개인되지 않습니다

    는 C를 혼합 ++ 및 C# 자세한 내용

    • http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.aspx
    • http://msdn.microsoft.com/en-us/library/dd997372.aspx
    • 에 다음 링크를 참조하십시오 그러나 그것은 지명되었다.

      일반적으로 작성자 프로세스에서 작성하고 독자는 이름으로 열립니다. 바이러스 백신 소프트웨어는 이러한 종류의 I/O를 다른 모든 방식과 동일한 방식으로 사용하지만 통신을 차단하지는 않습니다.

      char shmName[MAX_PATH+1]; 
      sprintf(shmName, "shmVideo_%s", name); 
      shmName[MAX_PATH] = '\0'; 
      _hMap = 
          CreateFileMapping(
           INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, size, shmName); 
      if(_hMap == 0) { 
          throw OSException(__FILE__, __LINE__); 
      } 
      _owner = (GetLastError() != ERROR_ALREADY_EXISTS); 
      _mutex = Mutex::getMutex(name); 
      Synchronize sync(*_mutex); 
      _data = (char *)MapViewOfFile(_hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); 
      if(_data == 0) { 
          throw OSException(__FILE__, __LINE__); 
      } 
      
    +0

    이것은 좋은 대답 인 것 같습니다. 고마워,하지만 메모리 매핑 된 파일에 대한 질문이 많다. 첫째, 관리되지 않는 측면 (C++ 클라이언트)에서 다른 관리되는 프로세스 메모리 파일에 어떻게 액세스 할 수 있습니까? 둘째, 사용자 권한, 바이러스 백신 및 기타 보안 소프트웨어/제한은 무엇입니까? –

    +0

    감사합니다. 내가 한 번 살펴보고 당신의 대답을 받아 들일 것입니다. 현재 더 많은 7 시간이 필요하기 때문에 현상금을 포기할 수 있습니다 :) –

    +0

    현재 메모리 매핑 파일을 사용하고 있으며 성능이 매우 좋습니다. 다행히도 관리되는 측면과 관리되지 않는 측면에서 액세스하는 데 아무런 문제가 없었습니다. 어떤 사람이주의를 기울일 필요가있는 것은 단지 정밀도가 거의 필요없는 다중 프로세스 쓰기입니다. 감사. –

    0

    좋아하는 압축기 -ffmpeg와 함께 스트리밍에 live555 http://www.live555.com/을 사용하십시오.

    +0

    그럼 어떻게하면 데이터 비트 맵을 보낼 수 있습니까?! 라이브 캠이므로 디스크에 저장하지 않고 FFMPEG를 사용하여 비디오로 변환 한 다음 Live555를 사용하여 전송하십시오! 나는 메모리에서 비디오 (다시 메모리에 비트 맵을 인코딩 할 수있는 일종의 실시간 솔루션이 필요하고 비트 맵은 스트리밍되므로 앱을 시작할 때 사용할 수 없다.) 그리고 다른 솔루션 (또는 같은 라이브러리 나 이 보내는 부분을 쓸 수 있습니다) 다른 애플 리케이션에 보낼 수 있습니다. 또한 데이터를 메모리의 RGB 데이터 프레임으로 디코딩 할 수 있어야합니다. –

    관련 문제