저는 단순히 스마트폰 마이크로 음성을 입력받고 이것을 가공해서 TCP 또는 UDP 소켓을 이용해서 전송하고
전송받은 스마트폰에서는 스피크로 출력하면 될 것이라고 간단하게 생각했는데
이렇게 간단하게 구현이 안되는 것인가요?
혹시 관련해서 아시는 프로그래머 님들이 있으시면 조언 부탁드리겠습니다!ㅎ
SIP은 세션과 관련된 것입니다. 그냥 단순히 1대 1로 데이터 전송하기 위해 서로 간에 IP, 포트 다 알면 필요 없겠죠.
여러 사람이 참여하고 세션 맺고 끊고 등등을 하려면 단순치가 않고 SIP이 필요하며 음성 품질을 높이기 위해서는 또 많은 기술들이 들어갑니다. 목적이 뭐냐에 따라 사용되는 기술들이 달라지므로 우선 목적을 명확히 하신 후에 관련 기술을 하나씩 공부하시면 될 듯 합니다.
단순히 1대 1 통신이니까 복잡하게 생각하지 않으셔도 됩니다. 버퍼 콘트롤만 잘 하시면 음성 끊어짐 없이 잘 전달됩니다. 딜레이가 약간은 있겠지만요. TCP보다는 UDP가 더 잘 될 거예요. 음성 데이터는 못 받으면 그냥 버려도 됩니다. 한두번 못 받는다고 별로 문제되지는 않으니까요.
보내는 루틴과 받는 루틴 따로 쓰레드 만드시구요. 처음 하시는 거면 몇 번 시행착오 겪으셔야 할 거예요.
샘플링 주파수를 낮추면 그냥 PCM으로 보내셔도 되고 샘플링 주파수가 높아 데이터 양이 많다 싶으면 인코딩해서 보내시면 됩니다.
근데 안드로이드 폰에서 소프트웨어적으로 인코딩/디코딩하는 건 딜레이를 유발시킵니다.
음성 품질이냐 딜레이냐를 두고 고민해 보셔야 할 듯 합니다.
AudioRecord에서 샘플링 주파수는 아무 값이나 넣으면 안되고 폰에서 지원하는 주파수를 넣어야 합니다. 기본적으로 44100Hz는 모든 폰에서 지원한다고 되어 있지만 폰 제조사를 믿을 수 있을지는 의문이고, 다른 주파수는 폰마다 다르기 때문에 테스트 해보셔야 합니다.
그냥 가지고 계신 폰만 되면 된다면 지원하는 주파수를 찾으시고 아니면 모든 폰이 지원한다고 되어 있는 44100Hz로 샘플링하시되 통신으로 보낼 때 서브샘플링해서 데이터 양을 줄이셔도 됩니다. 물론 음질은 떨어지겠죠.
자세하게 설명하면 끝이 없으므로 그냥 간단하게 설명 드릴께요.
마이크로 일정 시간 간격으로 데이터를 얻을 거고(샘플링), 스피커로 일정 시간 간격으로 데이터를 내보내겠죠.
근데 통신으로 데이터를 보내면 그 일정 시간과 정확하게 같은 주기로 데이터가 가지 않습니다. 데이터가 전달되는 시간 간격은 들쑥날쑥하겠죠. 이걸 일정 시간 간격이 되도록 해주어야 하는데 이를 위해서는 큐가 필요할 겁니다.
만약 통신으로 데이터가 전달되는 시간이 항상 같다면 말씀하신 대로 되겠지만 그렇지 않기 때문에 큐에 데이터가 쌓이고, 큐에 쌓이는 데이터의 개수만큼 딜레이가 생깁니다.
큐가 꽉 차면 데이터를 보내봐야 큐에 안 들어가니까 보내지 말라고 해야 할거고 큐가 다 비어가면 빨리 좀 보내달라고 해야 할거고... 이게 버퍼 콘트롤입니다.
큐가 꽉 차는 건 큐의 크기에 달려 있고 최악의 경우 큐의 크기만큼 딜레이가 생길 겁니다.
버퍼 콘트롤은 생각보다 쉽지는 않습니다. 다 설명드리기엔 내용이 너무 많고 실제로 해보시면서 시행착오를 겪다보면 어느 정도 해결하실 수 있을 거라 생각합니다. 아니면 데이터 통신에 대해 따로 공부하시는 게 필요할 수도 있겠습니다.




말씀하신 대로 구현하시면 됩니다만, 음성은 영상보다 타이밍에 더 민감합니다. 타이밍이 안 맞으면 귀에 거슬리게 되죠.
그래서 큐를 만드시고 버퍼 콘트롤을 하셔야만 합니다. 큐를 크게 만들면 딜레이가 커지니까 잘 조정하시구요.