2010-08-09 2 views
1

오디오 스트림으로 다시 어셈블하려는 RTP 패킷이 있습니다. 각 패킷마다 시퀀스 번호, SSRC, 타임 스탬프 및 데이터 자체를 나타내는 바이트 배열이 있습니다.RTP 패킷 결합

현재 각각의 SSRC에 의해 패킷의 각 하위 세트를 가져 와서 타임 스탬프로 순서를 지정하고 순서대로 바이트 배열을 결합합니다. 그런 다음 바이트 배열을 혼합합니다. 결과로 나오는 오디오 데이터는 훌륭하게 들립니다. (모든 것이 제 시간에 끝났음을 의미합니다.) 많은 패킷 손실이 없기 때문에 걱정입니다. 나는 빈 오디오의 비트를 추가해야 할 곳없는 패킷에 대한 그래서

, 몇 가지 질문 ...

  1. 는 누락 된 일련 번호를 보여줍니다. 나는 시퀀스 번호가 "랩 어라운드 (wraps around)"되는 경우가 많으므로 타임 스탬프를 사용하여 부분 집합으로 나누어야한다. 그런 다음 해당 하위 집합에서 누락 된 시퀀스 번호를 찾아 필요에 따라 추가 할 수 있습니다. 그게 옳은 일처럼 들리니?

  2. 나는 타임 스탬프가 무엇에 좋은지 전혀 알지 못했다. 이미 기존 패킷을 녹음하고 누락 된 패킷을 채우기 때문에 걱정하지 않아도 될까요?

답변

1

1) 알고리즘에서 타임 스탬프를 사용하지 마십시오. 불량 클라이언트로부터 스트림을 수신하는 경우 (부적절한 타임 스탬프) 알고리즘이 실패합니다. 코덱 유형에 따라 "타임 스탬프 증가"값 변경. 이 경우 다른 코덱에 대해 다른 하위 집합이 필요할 수 있습니다. 시퀀스 번호에는 제한이 없습니다. 시퀀스 번호는 단조롭게 증가합니다. 시퀀스 번호를 사용하면 손실 된 패킷을 쉽게 추적 할 수 있습니다.

2) 타임 스탬프는 오디오와 비디오 간의 동기화에 사용됩니다. 주로 립싱크 용입니다. 동기화를 달성하기 위해 오디오 및 비디오 타임 스탬프 간의 관계가 설정됩니다. 귀하의 경우에는 유일한 오디오이므로 타임 스탬프 사용을 피할 수 있습니다.

편집 : (컴포트 노이즈에 대한 실시간 전송 프로토콜 (RTP) 페이로드 (CN)) RFC 3389에 따르면

RTP 어떤 오디오 페이로드 형식에 대한 불연속 전송 (묵음 억제를) 할 수 있습니다. 수신기는 의 RTP 시퀀스 번호이 하나씩 만 증가 했음에도 불구하고 의 RTP 타임 스탬프가 이전 패킷으로 덮어 진 간격 끝과 인접하지 않음을 관찰하여 무음 후 첫 번째 패킷에서 무음 억제를 확인할 수 있습니다. RTP 마커 비트는 일반적으로 그러한 패킷에 설정된 입니다.

+0

2) 시퀀스 번호가 단조롭게 증가하므로 타임 스탬프가 필요하지 않습니다. 예를 들어, h.264 코덱의 비디오 프레임은 전에 전송 된 미래의 프레임에 의존합니다. 나는 비슷한 접근법을 사용하는 오디오 코덱을 알고 있지 않다. – Boris

+0

즉, 침묵 억제가있는 경우 시퀀스 번호 나누기를 사용했다. 즉, 일부 장비는 무음을 감지하고 패킷 전송을 중지하며 5 초 후에 패킷 전송을 다시 시작합니다. 이제 패킷 사이에 5 초가 걸리지 만 그만큼 연속적입니다. 시퀀스 번호 (적절한 타임 스탬프는 5 초간의 침묵을 알려줍니다). – nos

+0

@nos 예. 쾌적함이나 침묵 억제가 필요한 경우 적합합니다. 나는 나의 대답을 편집했다. – Alam

1

1) 시퀀스 번호가 빠르게 "줄 바꿈"되지 않는다고 생각합니다. 이것은 16 비트 값이므로 모든 65536 개의 메시지를 감싸고 메시지가 10 밀리 초마다 전송 되더라도 10 분 이상 전송됩니다. 패킷이 오랫동안 손실 될 가능성은 거의 없습니다. 그래서 제 생각에는 시퀀스 번호 만 확인해야합니다. 타임 스탬프를 확인하는 것은 무의미합니다.

2) 나는 당신이 타임 스탬프에 대해 많이 걱정하지 않아야한다고 생각합니다. 일부 프로토콜은이 값을 채우지 않고 시퀀스 번호에서만 릴레이한다는 것을 알고 있습니다.

+0

전송 시간이 10 분을 넘을 것이므로 동일한 시퀀스 번호의 패킷이 여러 개 있지만 타임 스탬프가 다릅니다. – Dan

+0

이 패킷이있는 양식을 설명해 주시겠습니까? 왜냐하면 패키지가 완전히 정렬되지 않았기 때문에 타임 스탬프를 사용하는 알고리즘이 괜찮다고 생각하기 때문입니다. 그러나 패키지가 도착 시간 (예 : 패키지가 Wireshark/tcpdump 트래픽 덤프에서 온 경우)에 따라 다소 차이가 있다면 제 의견으로는 타임 스탬프를 확인하는 것이 무의미합니다. 또한 실시간으로이 작업을 수행하는지 언급하지 않았습니다 (소켓에서 스트림을 수신하여 저장하거나 최대한 빨리 재생하려는 경우). 또는 후 처리입니다. 실시간으로 알고리즘은 달라야합니다. – Zuljin

+0

winpcap으로 패킷을 캡쳐하고 있습니다. 녹음 기능에는 두 가지 기능이 있습니다. 첫 번째는 스트림 중에 어느 시점에 사용자가 레코드를 클릭 할 수 있습니다. 나중에 녹음을 중지하고이 시점에서 두 이벤트 사이에 수신 된 패킷을 저장합니다. 녹음하는 두 번째 방법은 스트림의 끝 부분에 모든 오디오 데이터가 모아져 파일로 저장됩니다. – Dan

0

나는 위의 응답에서 Zulijn이 무엇을 얻고 있는지 생각해 봅니다. 패킷이 캡처 된 순서대로 저장되어 있다면 순서가 잘못된 패킷을 찾기 위해 몇 가지 간단한 규칙을 사용할 수 있습니다. 50 패킷을 되돌아보고 50 패킷을 전달합니다. 그것이 없으면 잃어버린 패킷으로 계산됩니다.

이렇게하면 일련 번호가 감겨져있는 문제가 없어야합니다. 손실 된 패킷을 처리하기 위해 사용할 수있는 많은 기술이 있으므로 '오디오 패킷 손실'또는 'VOIP 패킷 손실 은폐'를 Google에 유용하게 활용할 수 있습니다. Adam이 언급 한 것처럼 타임 스탬프는 코덱에 따라 다를 수 있으므로 사용하려는 경우이를 이해해야합니다.

실제 응용 프로그램은 무엇인지 언급하지 않지만 수신 된 오디오가 실제로 들리는 소리를 이해하려는 경우 지터 버퍼 크기와 같은 정보가 더 필요합니다. 이는 수신기의 수신기 길이 패킷이 손실되었다고 결정하기 전에 시퀀스 패킷을 벗어나기를 기다립니다. 이것이 의미하는 바는 파일에 '실세계'수신기가 포기하고 재생하지 못한 시퀀스가 ​​아닌 패킷이있을 수 있다는 것입니다. 즉, 파일에서의 재구성이 실제보다 더 높은 품질을 제공 할 수 있습니다 시간 '경험.

양방향 전송 인 경우 지연이 매우 중요합니다 (일정 지연이 있어도 지터 및 패킷 손실에 영향을주지는 않지만). 이것은 일부 라디오 전화를 사용하고 일부 위성 전화 (또는 VoIP 전화)에서 여전히 사용했던 효과 유형이며 사용자 환경에 큰 영향을 줄 수 있습니다.

마지막으로, 다른 코덱 등 배경 소음을, (대화에서 예를 들어, 일시 정지) 오디오의 틈새를 위해 '침묵 톤'을 삽입 손실 된 패킷을 해결하기 위해 다양한 기술을 적용 억제 할 수있다 클라이언트

적절한를 얻으려면 지터 버퍼 및 수신자가 사용한 오류 수정/패킷 손실 기술을 사용하여 캡쳐 된 패킷을 최대한 정확하게 재생하려고 노력해야하는 사용자 경험을 느끼십시오.

+0

나는 그것이 조금 도움이된다고 생각한다. 시도해 볼게. – Dan