2017-04-16 3 views
0

OpenCV에서 컴퓨터 비전 처리를 수행하기 위해 DJI Phantom 3 카메라의 라이브 스트림 비디오를 C++ 응용 프로그램에서 가져와야합니다. 통신 위에서 잘 작동DJI Professional 3 카메라에서 라이브 비디오를 스트리밍하는 방법은 무엇입니까?

 mReceivedVideoDataCallBack = new CameraReceivedVideoDataCallback() { 

     @Override 
     public void onResult(byte[] videoBuffer, int size) { 
      //Here, I call a method from a class I created, that sends the buffer through UDP 
      if (gravar_trigger) controleVideo.enviarFrame(videoBuffer, size); 

      if (mCodecManager != null) mCodecManager.sendDataToDecoder(videoBuffer, size); 

     } 

    }; 

:

우선 나는이 콜백 내부 UDP 소켓을 통해 H264 원시 데이터를 전송했습니다. 그러나 C++ 데스크탑 응용 프로그램에서 UDP H264 데이터를 디코딩 할 수 없었습니다. FFmpeg lib로 테스트했지만 avcodec_send_packetavcodec_receive_frame을 사용하여 디코딩하기 위해 UDP 데이터로 AVPacket을 할당 할 수 없습니다. 내 UDP 통신이 소스에 대한 정보를 얻을 수있는 RTSP와 같은 스트림이 아니기 때문에 AVCodecContext에도 문제가있었습니다. 따라서 문제를 해결하기 위해 노력한 방법을 변경해야했습니다.

다음, 나는있는 데이터 ++ 응용 프로그램을 쉽게 OpenCV의 videoCapture를 사용하여 내 최종 C에서 얻을 수있는 RTSP 스트림 연결, 같은 것을 생성하는 Wowza Server에 안드로이드 비디오 카메라를 스트리밍 할 동료가 될 수 libstreaming을 발견했다. 그러나 libstreaming은 자체적으로 surfaceView을 사용합니다. 즉, libstreaming surfaceView을 DJI Drone의 videoSurface과 연결해야합니다. 나는 Android에 정말 익숙하지 않기 때문에 그렇게하는 방법에 대한 단서가 없습니다.

요약하면 올바른 접근 방법입니까? 누군가 더 좋은 아이디어가 있습니까? 미리 감사드립니다.

답변

1

나는 몇 가지를 내기 할 것입니다. 글쎄, 대부분 한 가지. 일반적으로 단편화 된 비디오 패킷을 보내기 전에 생성해야합니다. h264의 IDR은 udp 스트리밍을하기에는 너무 큽니다.

끝점 사이에 견고한 COM 링크가 있으면 하나의 큰 패킷 입력을 하나 이상의 작은 패킷 출력으로 변환하는 방법을 추가 할 수 있습니다.

아마도 1000 바이트보다 큰 패킷은 여러 개의 h264 NALU 유형 28로 나눌 필요가 있습니다. 작고 동일한 타임 스탬프를 가진 패킷은 STAP-A 유형 24로 보낼 수 있습니다. 일반적으로 stap-a에서 inband sps/pps를 찾을 수 있습니다.

IDR 및 대형 슬라이더 용 패킷 화 도구가 있으면 수신기에 depacketizor를 작성한 다음 명확하게 해독 된 그림을 얻어야합니다.

유형 28을 만드는 방법은 h264 RTP 사양을 참조하십시오.

관련 문제