본문 바로가기
c#

[C#] DTMF 전송 방식 (In-band vs Out-of-band) 및 RTP 패킷

by 개발에대해 2024. 8. 7.

 

[C#] DTMF (Dual Tone Multi Frequency) 전송 방식 정리 및 RTP 패킷 구현

DTMF 신호 전송은 VoIP 및 전화 시스템에서 숫자 입력을 처리할 때 핵심적인 요소입니다.

이 글에서는 C#으로 구현하는 DTMF RTP 패킷 생성 방법과 함께, In-band와 Out-of-band 전송 방식의 차이점도 정리합니다.

 

1. DTMF 전송 방식: In-band vs Out-of-band

In-band 방식

  • DTMF 신호를 음성 주파수 대역 내에서 전송
  • 추가 경로가 필요 없고 구현이 간단
  • 음성 압축, 잡음 등의 영향으로 신호 왜곡 가능성 있음

Out-of-band 방식

  • DTMF 신호를 음성 신호와 별도로 RTP 또는 SIP 메시지로 전송
  • 정확하고 신뢰도 높은 전송 가능
  • VoIP 시스템에서 표준적으로 사용됨

 

2. RTP를 이용한 DTMF Out-of-band 전송

VoIP 환경에서는 RTP(Real-time Transport Protocol)을 통해 DTMF 신호를 전송하는 것이 일반적입니다.

RFC 4733에 따라 DTMF 이벤트를 위한 Payload Type(보통 101)을 사용합니다.

RTP 패킷 주요 필드

  • eventId: 전송할 키 (0~9, *, #, A~D)
  • duration: 신호 지속 시간 (ms)
  • end: 시작 또는 종료 여부
  • volume: DTMF 톤의 음량

 

3. C# RTP 패킷 생성 예제

다음은 C# 코드로 DTMF RTP 패킷을 생성하는 예시입니다:

public RTPPacket MakeDtmfRTPPacket(int eventId, int duration, bool end, int volume)
{
    RTPPacket rtpPacket = new RTPPacket();
    byte[] dtmfRtpPayload = new byte[4];

    dtmfRtpPayload[0] = (byte)eventId;
    dtmfRtpPayload[1] = (byte)((end ? 1 : 0) << 7 | (volume & 0x1F));
    dtmfRtpPayload[2] = (byte)((duration >> 8) & 0xFF);
    dtmfRtpPayload[3] = (byte)(duration & 0xFF);

    rtpPacket.data = dtmfRtpPayload;
    rtpPacket.sequenceNumber = NextSeqNo();
    rtpPacket.timestamp = NextTimeStamp(dtmfRtpPayload.Length);
    rtpPacket.sourceId = SourceId;
    rtpPacket.version = 2;
    rtpPacket.marker = end;
    rtpPacket.PayloadType = 101;
    rtpPacket.headerLength = RTPPacket.MinHeaderLength;

    return rtpPacket;
}

이 함수는 DTMF 정보를 담은 RTP 패킷을 생성하여 VoIP 시스템과 연동하는 데 사용할 수 있습니다.

 

4. Wireshark에서 RTP DTMF 패킷 필터링

Wireshark를 사용하면 DTMF RTP 패킷을 분석할 수 있습니다.

RTP 패킷의 Payload Type이 DTMF 전용인 경우(보통 101), 아래 필터를 사용하면 DTMF 패킷만 필터링할 수 있습니다.

((rtp) && (rtp.p_type == 101))

이 필터는 실시간 패킷 분석 중 DTMF 신호 전송 흐름을 모니터링할 때 유용합니다.

 

DTMF는 전화 시스템과 VoIP 환경에서 핵심적인 입력 방식입니다.

In-band 방식은 구현이 간단하지만 음질에 영향을 받을 수 있고,

Out-of-band 방식은 RTP를 통해 더 정확하고 안정적인 전송이 가능합니다.

 

'c#' 카테고리의 다른 글

[C#] WPF Button 이미지  (0) 2024.07.17
[C#] 오디오 입력장치 조회  (0) 2024.07.11
[C#] AES256 암/복호화  (0) 2024.07.10