RTP 수신기를 구현 중입니다. UDP 패킷을 수신하고, 코덱을 디코드하고, 재생을 위해 AudioTrack
에 PCM 샘플을 씁니다. 문제가있는 것 같습니다, 그 AudioTrack.write
차단하고 같은 UDP 패킷을 놓치지 그 동안.AudioTrack에서 비 차단 데이터 재생
이 문제를 해결하는 방법에 대한 알려진 해결책이 있습니까?
오디오 데이터와 setNotificationMarkerPosition
에 대해 자체 버퍼를 사용하려고했지만 audioTrack이 버퍼가 어느 정도 채워지면 마커 위치에 도달하지 못하거나 audioTrack.write
이 다시 블로킹되는 것처럼 보입니다.
또한 각 쓰기 전에 audioTrack.pause()
을 시도한 다음 다시 .play()
을 시도했지만 음질에 현저한 영향을 미치는 것 같습니다.
저는 실제로 비슷한 솔루션을 사용하고 있습니다. audioData에 대한 수동 링 버퍼가 있습니다. 하나의 스레드가 그것을 읽고 그것을 재생, 다른 스레드는 그것에 씁니다. 가득 차면 패킷이 삭제됩니다. 아직 완벽한 것은 아니지만 지금은 괜찮습니다. – rumpel
필자가 쓰레드를 쓰러 뜨리면 지연 시간은 ringbuffer의 크기에 달려 있다고 생각합니다. 문제가 발생하면 다음과 같이 삭제됩니다. *가 괜찮을 경우 _을 버려야합니다. ************* ___________ ********* 대신 패킷 삭제를 사용하는 경우 플레이어 측에서 이번에는 뭔가를 얻을 것입니다 : ****** _ * _ ** _ * _ * _ ** _ ****** 더 귀에 좋고 또한 딜레이가 더 좋고 실제로는 아닙니다. ringbuffer의 크기에 따라 다릅니다. 마지막으로 삭제할 때, 전체 패킷을 삭제할 필요가 없습니다. 패킷을 8로 나누고, 버퍼가 양호하면 삭제합니다. 버퍼가 너무 작 으면 2를 삭제하십시오. – guness
그리고 버퍼가 실제로 손상되면 모두 삭제됩니다. 그 사이에 0에서 8로 변경하십시오. 더 나은 방법을 찾으면 그냥 알아둬야합니다. – guness