Estou trabalhando em um projeto em que os dados de áudio são transmitidos para um dispositivo. Os dados de áudio são codificados via opus e transmitidos com cargas úteis de 20 ms por vez. A transmissão é feita via TCP para evitar completamente a perda de pacotes. O objetivo do streaming é ter o mais próximo possível do streaming de áudio ao vivo, sem perda de áudio ou tremulação.
Atualmente, o que acontece em conexões mais lentas com a Internet, o áudio pode tremer um pouco. Atualmente, não estou usando nenhum buffer, mas o objetivo é poder ter o mais próximo possível da "transmissão ao vivo", mas ao mesmo tempo eliminando a instabilidade.
Examinei os buffers de jitter, e parece que os buffers de jitter também devem lidar com atrasos nas duas extremidades, para que ambas as extremidades estejam o mais sincronizadas possível, o que parece um exagero para a minha situação. Receio que, se eu criar um tamanho de buffer estático, ele removerá o aspecto de transmissão ao vivo, se isso não for necessário.
Então, isso me deixa com algumas perguntas, que são de alguma forma relacionadas.
- Qual é um bom método ou algoritmo para detectar o comprimento do buffer?
- Qual é a melhor maneira de começar a alimentar dados para o decodificador na extremidade do receptor? Quando o buffer atingir uma certa quantidade de milissegundos cheio, ele começará a alimentar dados em cargas úteis de 20 ms?
- Atraso na reprodução se o buffer ficar insuficiente?
- O buffer terá bytes ou duração de tempo?
Muito obrigado!
fonte
Respostas:
Depende inteiramente da taxa de transferência da sua rede - se você pode manter um único segundo de dados preenchidos, é tudo o que precisa! Obviamente, você precisa determinar por quanto tempo sua rede vai gaguejar e deixar de preencher o buffer. Teste e veja.
Caso contrário, pode ser mais fácil configurar o tamanho do buffer, as redes rápidas podem ter um segundo de buffer (ninguém notará o áudio 1 segundo após a captura) e as redes lentas de alta latência ou baixa taxa de transferência podem armazenar mais buffer. Você poderá redimensionar seu buffer durante a reprodução, se ele esvaziar completamente, mas é mais provável que você gagueje a reprodução continuamente nesse caso.
Geralmente, você só atrasa a reprodução se o buffer se esvazia completamente. Não faz sentido ter um buffer se você não o usar.
Se o seu áudio for pacotes de 20 ms, tamanho == tempo.
fonte