2012-02-23 2 views
7

불행히도 나는 내 IP 카메라에 올바르게 액세스하기 위해 RTP/RTCP 통신의 약간의 구현을 계속 고수하고있다. 내가RTCP/RTP 통신 문제

카메라를 원하는 작업

내가 읽고 싶은 내부 버퍼를 가지고있다. 그래서 RTSP를 통해 카메라와 통신하고 데이터를 스트리밍하도록 지시합니다. 카메라가 전체 버퍼를 통과하면 스트리밍이 중단됩니다. 내가 할 무엇

지금까지

  1. 스트림을 얻을 수있는 DESCRIBE/SETUP/PLAY 요청 (RTSP)에 대한 RTSP를 통해 통신하는 TCP 연결을 시작했습니다. 이 연결 은 카메라가 데이터를 스트리밍하는 동안이 열려 있어야합니다.

  2. A RTP (UDP 기반)를 통해 전송 된 데이터를 수신하는 포트 -이 문제를 다루는 것은 아무런 문제가 아니며, 나는 전혀 액세스 할 수 없으며, 완벽 성을 위해 언급하고 싶습니다. .

  3. RTCP를 수신하는 UDP 소켓/Source Descriptions. 스트림이 언제 중단되는지 (2 번에서 언급했듯이 스트리밍이 중지되었을 때만 볼 수는 없습니다) 모르기 때문에 이것은 중요합니다. 이 소켓에서는 RTCP Sender Report Goodbye이 올 때까지 읽었습니다. 이는 스트리밍이 끝났음을 의미합니다. 그런 다음 TCP 소켓을 닫을 수 있습니다 (RTSP 통신에서). 잘못된

    그것은 2메가바이트 또는 4메가바이트 같은 작은 버퍼 크기를 위해 노력하고 무슨 일

. 소스 설명과 Goodbye이 나타납니다. 그러나 필자가 테스트 한 필자는 16MB를 사용하기를 원했지만 (여전히 카메라의 절반 이하 임) 발신자 보고서를 수신했지만 어느 시점 (항상 약 8MB +/- 300KB)에서 카메라는 송신을 중지합니다.

사실 내가 문제없이 VLC를 통해 버퍼에 액세스 할 수 있다는 사실입니다.

가능한 이유

이을 : 난 누락 한 가지 내가 아래 거 언급이야 ... 거의 완전히 내 응용 프로그램과 동일한 통신 (RTSP 및 RTCP)에서 보았다 내가 너의 조언이 필요한 부분이야.

가능성 : VLC를 통해 스트리밍하는 경우 수신기의 부족은 좀 RTCP Receiver Reports 카메라에 VLC에서 전송합니다 (Sender Reports 같은 순환)이 있었다 것으로 나타났습니다

를보고합니다. Camere가 특정 시간 (또는 특정 바이트 양을 전송 한 후)에 적어도 하나의 Receiver Report을 예상 할 수 있습니까? 나는 다른 어떤 이유도 생각할 수 없다.

솔루션?

  • 우리는 내가 많은 정보를 수행하지 않고이를 구현하는 방법이 있는지 알고 싶습니다 더 Receiver Reports이 없기 때문에 카메라가 스트리밍을 중지한다고 가정합니다. 나는 이미 RFC 3550 중 일부를 읽었으며 보고서 메시지 뒤에는 여전히 많은 논리가 있다고 생각합니다. 이제 실제로는 이 필요하지 않습니다.이 필요합니다. 따라서 으로 전체 RTCP 프로토콜을 구현해야합니다. 카메라가 스트리밍을 계속할 수 있도록 Receiver Report 더미 프레임을 보내려면 충분합니까? 그렇다면 어떻게 보이나요?

  • Receiver Reports의 부족과 관련이없고 단지 필요하지 않은 경우 카메라가 스트리밍을 중단하는 이유는 무엇입니까? 어떤 제안?

편집 :

난 그냥 더미 Receiver Report의 어떤 종류를 만들 관리하고 작동하는 것 같다 좋아요 단지

내가 (그냥 그때는 안녕을 원하는있어 12메가바이트를받을 수) 28Byte 버퍼를 채우고 헤더 필드에 다음과 같은 값을 사용했습니다.

buffer[0] = 0x80; // Version 2 , Padding = false, Reception Count = 0 
buffer[1] = 0xC9; // Packet Type 201 Receiver Report 
buffer[2] = 0x00; // Higher byte for total length 
buffer[3] = 0x06; // Lower byte for total length (in 32 Bit words -> 28 Byte) 

나머지 버퍼 0으로 채워진다. 그래, 나는 그것이 단지 해킹 인 것을 알고 있으며, 아이들에게 이렇게 프로그램하도록 말하지 말아야한다.

이제 내 질문이 조금 바뀝니다.이 해킹으로 괜찮습니까? 그것은 작동하는 것처럼 보이지만, 나는 여전히 내 카메라가 그 더미 데이터를 사용하고 구성을 변경함으로써 약간의 이상한 것들을 포함 할까봐 걱정하고있다.

+0

이 문제를 처리 할 기존 RTP 라이브러리를 사용 해본 적이 있습니까? – nos

+0

@nos 물론 이것은 대안이 될 수 있습니다. 그러나 실제로 스트림을 살아 있기를 원하기 때문에 실제로 라이브러리를 사용하지 않기를 원했습니다. RTCP에서 파싱 할 필요조차 없습니다 (작별 인사이면 물론 메시지). 둘째로 전체 애플리케이션은 완전히 비동기 적이어야하므로 모든 소켓을 직접 관리하고 싶습니다. Afaik 대부분의 libs는 자신의 소켓과 연결을 제어합니다. 하지만 정말 수신기 보고서 (일부 "복잡한"데이터)를 채울 필요가 있다면 아마도 라이브러리를 고려해야합니다. – Toby

+0

앱 실행 중에 wireshark 패킷 캡처를 수행 했습니까? 이렇게하면 데이터가 무엇이 발생했는지 또는 발생하지 않았는지 정확하게 알 수 있습니다. –

답변

1

스트림에서 직접 데이터를 읽어야합니다. 그런 식으로 거짓 보고서 대신 실제 보고서를 제공 할 수 있습니다.

다른 응용 프로그램이나 라이브러리의 다른 포트로 전달해야하는 경우 간단하게 할 수 있습니다.

+0

실제로 모든 리소스를 절약하고 싶습니다. (임베디드 장치)이 모든 데이터를 읽지 않도록하고 싶습니다. RTCP를 제외하고는 (RTCP 제외) 어쨌든 필요하지 않기 때문에 매우 불필요합니다. 그래서 나는 약간의 더미 값으로 그것을하는 것을 정말로 좋아할 것입니다. – Toby

+0

"필요"하지 않을 수도 있지만 서버가 수행하므로 네트워크 플러딩 및 패킷 손실을 방지하기 위해 데이터를 조정/조절할 수 있습니다. – Deanna

1

수신기 보고서 (RR)는 일부 카메라에서 "활성 상태 유지"메시지로 사용할 수 있습니다. 카메라가 GET_PARAMETER를 수락하면 Keep Alive 메시지로 매분 GET_PARAMETER 카메라를 보내도록 시도 할 수 있습니다. 그것을 DESCRIBE에 대한 응답으로 알려줍니다.

일부 IP 카메라는 RR을 올바르게 구문 분석 할 수 없습니다. 나는 실제로 삼성 카메라의 일부 모델이 (기술 지원에 따라) 연결을 끊기 때문에 RR 메시지를 보내는 클라이언트에서 사용하는 live555 라이브러리를 막으려하고 있습니다.